Passed
Push — master ( c65cc4...4fcf9e )
by Wei
03:50
created

jQuery.extend.buildFragment   F

Complexity

Conditions 28
Paths > 20000

Size

Total Lines 126

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 28
nc 21320
nop 4
dl 0
loc 126
rs 0
c 1
b 0
f 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like jQuery.extend.buildFragment often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/*!
2
 * jQuery JavaScript Library v1.10.2
3
 * http://jquery.com/
4
 *
5
 * Includes Sizzle.js
6
 * http://sizzlejs.com/
7
 *
8
 * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
9
 * Released under the MIT license
10
 * http://jquery.org/license
11
 *
12
 * Date: 2013-07-03T13:48Z
13
 */
14
(function( window, undefined ) {
15
16
// Can't do this because several apps including ASP.NET trace
17
// the stack via arguments.caller.callee and Firefox dies if
18
// you try to trace through "use strict" call chains. (#13335)
19
// Support: Firefox 18+
20
//"use strict";
21
var
22
	// The deferred used on DOM ready
23
	readyList,
24
25
	// A central reference to the root jQuery(document)
26
	rootjQuery,
27
28
	// Support: IE<10
29
	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
30
	core_strundefined = typeof undefined,
31
32
	// Use the correct document accordingly with window argument (sandbox)
33
	location = window.location,
34
	document = window.document,
35
	docElem = document.documentElement,
36
37
	// Map over jQuery in case of overwrite
38
	_jQuery = window.jQuery,
39
40
	// Map over the $ in case of overwrite
41
	_$ = window.$,
42
43
	// [[Class]] -> type pairs
44
	class2type = {},
45
46
	// List of deleted data cache ids, so we can reuse them
47
	core_deletedIds = [],
48
49
	core_version = "1.10.2",
50
51
	// Save a reference to some core methods
52
	core_concat = core_deletedIds.concat,
53
	core_push = core_deletedIds.push,
54
	core_slice = core_deletedIds.slice,
55
	core_indexOf = core_deletedIds.indexOf,
56
	core_toString = class2type.toString,
57
	core_hasOwn = class2type.hasOwnProperty,
58
	core_trim = core_version.trim,
59
60
	// Define a local copy of jQuery
61
	jQuery = function( selector, context ) {
62
		// The jQuery object is actually just the init constructor 'enhanced'
63
		return new jQuery.fn.init( selector, context, rootjQuery );
64
	},
65
66
	// Used for matching numbers
67
	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
68
69
	// Used for splitting on whitespace
70
	core_rnotwhite = /\S+/g,
71
72
	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
73
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
74
75
	// A simple way to check for HTML strings
76
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
77
	// Strict HTML recognition (#11290: must start with <)
78
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
79
80
	// Match a standalone tag
81
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
82
83
	// JSON RegExp
84
	rvalidchars = /^[\],:{}\s]*$/,
85
	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
86
	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
87
	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
88
89
	// Matches dashed string for camelizing
90
	rmsPrefix = /^-ms-/,
91
	rdashAlpha = /-([\da-z])/gi,
92
93
	// Used by jQuery.camelCase as callback to replace()
94
	fcamelCase = function( all, letter ) {
95
		return letter.toUpperCase();
96
	},
97
98
	// The ready event handler
99
	completed = function( event ) {
100
101
		// readyState === "complete" is good enough for us to call the dom ready in oldIE
102
		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
103
			detach();
104
			jQuery.ready();
105
		}
106
	},
107
	// Clean-up method for dom ready events
108
	detach = function() {
109
		if ( document.addEventListener ) {
110
			document.removeEventListener( "DOMContentLoaded", completed, false );
111
			window.removeEventListener( "load", completed, false );
112
113
		} else {
114
			document.detachEvent( "onreadystatechange", completed );
115
			window.detachEvent( "onload", completed );
116
		}
117
	};
118
119
jQuery.fn = jQuery.prototype = {
120
	// The current version of jQuery being used
121
	jquery: core_version,
122
123
	constructor: jQuery,
124
	init: function( selector, context, rootjQuery ) {
125
		var match, elem;
126
127
		// HANDLE: $(""), $(null), $(undefined), $(false)
128
		if ( !selector ) {
129
			return this;
130
		}
131
132
		// Handle HTML strings
133
		if ( typeof selector === "string" ) {
134
			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
135
				// Assume that strings that start and end with <> are HTML and skip the regex check
136
				match = [ null, selector, null ];
137
138
			} else {
139
				match = rquickExpr.exec( selector );
140
			}
141
142
			// Match html or make sure no context is specified for #id
143
			if ( match && (match[1] || !context) ) {
144
145
				// HANDLE: $(html) -> $(array)
146
				if ( match[1] ) {
147
					context = context instanceof jQuery ? context[0] : context;
148
149
					// scripts is true for back-compat
150
					jQuery.merge( this, jQuery.parseHTML(
151
						match[1],
152
						context && context.nodeType ? context.ownerDocument || context : document,
153
						true
154
					) );
155
156
					// HANDLE: $(html, props)
157
					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
158
						for ( match in context ) {
159
							// Properties of context are called as methods if possible
160
							if ( jQuery.isFunction( this[ match ] ) ) {
161
								this[ match ]( context[ match ] );
162
163
							// ...and otherwise set as attributes
164
							} else {
165
								this.attr( match, context[ match ] );
166
							}
167
						}
168
					}
169
170
					return this;
171
172
				// HANDLE: $(#id)
173
				} else {
174
					elem = document.getElementById( match[2] );
175
176
					// Check parentNode to catch when Blackberry 4.6 returns
177
					// nodes that are no longer in the document #6963
178
					if ( elem && elem.parentNode ) {
179
						// Handle the case where IE and Opera return items
180
						// by name instead of ID
181
						if ( elem.id !== match[2] ) {
182
							return rootjQuery.find( selector );
183
						}
184
185
						// Otherwise, we inject the element directly into the jQuery object
186
						this.length = 1;
187
						this[0] = elem;
188
					}
189
190
					this.context = document;
191
					this.selector = selector;
192
					return this;
193
				}
194
195
			// HANDLE: $(expr, $(...))
196
			} else if ( !context || context.jquery ) {
197
				return ( context || rootjQuery ).find( selector );
198
199
			// HANDLE: $(expr, context)
200
			// (which is just equivalent to: $(context).find(expr)
201
			} else {
202
				return this.constructor( context ).find( selector );
203
			}
204
205
		// HANDLE: $(DOMElement)
206
		} else if ( selector.nodeType ) {
207
			this.context = this[0] = selector;
208
			this.length = 1;
209
			return this;
210
211
		// HANDLE: $(function)
212
		// Shortcut for document ready
213
		} else if ( jQuery.isFunction( selector ) ) {
214
			return rootjQuery.ready( selector );
215
		}
216
217
		if ( selector.selector !== undefined ) {
218
			this.selector = selector.selector;
219
			this.context = selector.context;
220
		}
221
222
		return jQuery.makeArray( selector, this );
223
	},
224
225
	// Start with an empty selector
226
	selector: "",
227
228
	// The default length of a jQuery object is 0
229
	length: 0,
230
231
	toArray: function() {
232
		return core_slice.call( this );
233
	},
234
235
	// Get the Nth element in the matched element set OR
236
	// Get the whole matched element set as a clean array
237
	get: function( num ) {
238
		return num == null ?
239
240
			// Return a 'clean' array
241
			this.toArray() :
242
243
			// Return just the object
244
			( num < 0 ? this[ this.length + num ] : this[ num ] );
245
	},
246
247
	// Take an array of elements and push it onto the stack
248
	// (returning the new matched element set)
249
	pushStack: function( elems ) {
250
251
		// Build a new jQuery matched element set
252
		var ret = jQuery.merge( this.constructor(), elems );
253
254
		// Add the old object onto the stack (as a reference)
255
		ret.prevObject = this;
256
		ret.context = this.context;
257
258
		// Return the newly-formed element set
259
		return ret;
260
	},
261
262
	// Execute a callback for every element in the matched set.
263
	// (You can seed the arguments with an array of args, but this is
264
	// only used internally.)
265
	each: function( callback, args ) {
266
		return jQuery.each( this, callback, args );
267
	},
268
269
	ready: function( fn ) {
270
		// Add the callback
271
		jQuery.ready.promise().done( fn );
272
273
		return this;
274
	},
275
276
	slice: function() {
277
		return this.pushStack( core_slice.apply( this, arguments ) );
278
	},
279
280
	first: function() {
281
		return this.eq( 0 );
282
	},
283
284
	last: function() {
285
		return this.eq( -1 );
286
	},
287
288
	eq: function( i ) {
289
		var len = this.length,
290
			j = +i + ( i < 0 ? len : 0 );
291
		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
292
	},
293
294
	map: function( callback ) {
295
		return this.pushStack( jQuery.map(this, function( elem, i ) {
296
			return callback.call( elem, i, elem );
297
		}));
298
	},
299
300
	end: function() {
301
		return this.prevObject || this.constructor(null);
302
	},
303
304
	// For internal use only.
305
	// Behaves like an Array's method, not like a jQuery method.
306
	push: core_push,
307
	sort: [].sort,
308
	splice: [].splice
309
};
310
311
// Give the init function the jQuery prototype for later instantiation
312
jQuery.fn.init.prototype = jQuery.fn;
313
314
jQuery.extend = jQuery.fn.extend = function() {
315
	var src, copyIsArray, copy, name, options, clone,
316
		target = arguments[0] || {},
317
		i = 1,
318
		length = arguments.length,
319
		deep = false;
320
321
	// Handle a deep copy situation
322
	if ( typeof target === "boolean" ) {
323
		deep = target;
324
		target = arguments[1] || {};
325
		// skip the boolean and the target
326
		i = 2;
327
	}
328
329
	// Handle case when target is a string or something (possible in deep copy)
330
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
331
		target = {};
332
	}
333
334
	// extend jQuery itself if only one argument is passed
335
	if ( length === i ) {
336
		target = this;
337
		--i;
338
	}
339
340
	for ( ; i < length; i++ ) {
341
		// Only deal with non-null/undefined values
342
		if ( (options = arguments[ i ]) != null ) {
343
			// Extend the base object
344
			for ( name in options ) {
345
				src = target[ name ];
346
				copy = options[ name ];
347
348
				// Prevent never-ending loop
349
				if ( target === copy ) {
350
					continue;
351
				}
352
353
				// Recurse if we're merging plain objects or arrays
354
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
355
					if ( copyIsArray ) {
356
						copyIsArray = false;
357
						clone = src && jQuery.isArray(src) ? src : [];
358
359
					} else {
360
						clone = src && jQuery.isPlainObject(src) ? src : {};
361
					}
362
363
					// Never move original objects, clone them
364
					target[ name ] = jQuery.extend( deep, clone, copy );
365
366
				// Don't bring in undefined values
367
				} else if ( copy !== undefined ) {
368
					target[ name ] = copy;
369
				}
370
			}
371
		}
372
	}
373
374
	// Return the modified object
375
	return target;
376
};
377
378
jQuery.extend({
379
	// Unique for each copy of jQuery on the page
380
	// Non-digits removed to match rinlinejQuery
381
	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
382
383
	noConflict: function( deep ) {
384
		if ( window.$ === jQuery ) {
385
			window.$ = _$;
386
		}
387
388
		if ( deep && window.jQuery === jQuery ) {
389
			window.jQuery = _jQuery;
390
		}
391
392
		return jQuery;
393
	},
394
395
	// Is the DOM ready to be used? Set to true once it occurs.
396
	isReady: false,
397
398
	// A counter to track how many items to wait for before
399
	// the ready event fires. See #6781
400
	readyWait: 1,
401
402
	// Hold (or release) the ready event
403
	holdReady: function( hold ) {
404
		if ( hold ) {
405
			jQuery.readyWait++;
406
		} else {
407
			jQuery.ready( true );
408
		}
409
	},
410
411
	// Handle when the DOM is ready
412
	ready: function( wait ) {
413
414
		// Abort if there are pending holds or we're already ready
415
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
416
			return;
417
		}
418
419
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
420
		if ( !document.body ) {
421
			return setTimeout( jQuery.ready );
422
		}
423
424
		// Remember that the DOM is ready
425
		jQuery.isReady = true;
426
427
		// If a normal DOM Ready event fired, decrement, and wait if need be
428
		if ( wait !== true && --jQuery.readyWait > 0 ) {
429
			return;
430
		}
431
432
		// If there are functions bound, to execute
433
		readyList.resolveWith( document, [ jQuery ] );
434
435
		// Trigger any bound ready events
436
		if ( jQuery.fn.trigger ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.fn.trigger is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
437
			jQuery( document ).trigger("ready").off("ready");
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
438
		}
439
	},
440
441
	// See test/unit/core.js for details concerning isFunction.
442
	// Since version 1.3, DOM methods and functions like alert
443
	// aren't supported. They return false on IE (#2968).
444
	isFunction: function( obj ) {
445
		return jQuery.type(obj) === "function";
446
	},
447
448
	isArray: Array.isArray || function( obj ) {
449
		return jQuery.type(obj) === "array";
450
	},
451
452
	isWindow: function( obj ) {
453
		/* jshint eqeqeq: false */
454
		return obj != null && obj == obj.window;
455
	},
456
457
	isNumeric: function( obj ) {
458
		return !isNaN( parseFloat(obj) ) && isFinite( obj );
459
	},
460
461
	type: function( obj ) {
462
		if ( obj == null ) {
463
			return String( obj );
464
		}
465
		return typeof obj === "object" || typeof obj === "function" ?
466
			class2type[ core_toString.call(obj) ] || "object" :
467
			typeof obj;
468
	},
469
470
	isPlainObject: function( obj ) {
471
		var key;
472
473
		// Must be an Object.
474
		// Because of IE, we also have to check the presence of the constructor property.
475
		// Make sure that DOM nodes and window objects don't pass through, as well
476
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
477
			return false;
478
		}
479
480
		try {
481
			// Not own constructor property must be Object
482
			if ( obj.constructor &&
483
				!core_hasOwn.call(obj, "constructor") &&
484
				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
485
				return false;
486
			}
487
		} catch ( e ) {
488
			// IE8,9 Will throw exceptions on certain host objects #9897
489
			return false;
490
		}
491
492
		// Support: IE<9
493
		// Handle iteration over inherited properties before own properties.
494
		if ( jQuery.support.ownLast ) {
495
			for ( key in obj ) {
496
				return core_hasOwn.call( obj, key );
497
			}
498
		}
499
500
		// Own properties are enumerated firstly, so to speed up,
501
		// if last one is own, then all properties are own.
502
		for ( key in obj ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
503
504
		return key === undefined || core_hasOwn.call( obj, key );
0 ignored issues
show
Bug introduced by
The variable key seems to not be initialized for all possible execution paths.
Loading history...
505
	},
506
507
	isEmptyObject: function( obj ) {
508
		var name;
509
		for ( name in obj ) {
0 ignored issues
show
Unused Code introduced by
The variable name seems to be never used. Consider removing it.
Loading history...
510
			return false;
511
		}
512
		return true;
513
	},
514
515
	error: function( msg ) {
516
		throw new Error( msg );
517
	},
518
519
	// data: string of html
520
	// context (optional): If specified, the fragment will be created in this context, defaults to document
521
	// keepScripts (optional): If true, will include scripts passed in the html string
522
	parseHTML: function( data, context, keepScripts ) {
523
		if ( !data || typeof data !== "string" ) {
524
			return null;
525
		}
526
		if ( typeof context === "boolean" ) {
527
			keepScripts = context;
528
			context = false;
529
		}
530
		context = context || document;
531
532
		var parsed = rsingleTag.exec( data ),
533
			scripts = !keepScripts && [];
534
535
		// Single tag
536
		if ( parsed ) {
537
			return [ context.createElement( parsed[1] ) ];
538
		}
539
540
		parsed = jQuery.buildFragment( [ data ], context, scripts );
541
		if ( scripts ) {
542
			jQuery( scripts ).remove();
543
		}
544
		return jQuery.merge( [], parsed.childNodes );
545
	},
546
547
	parseJSON: function( data ) {
548
		// Attempt to parse using the native JSON parser first
549
		if ( window.JSON && window.JSON.parse ) {
550
			return window.JSON.parse( data );
551
		}
552
553
		if ( data === null ) {
554
			return data;
555
		}
556
557
		if ( typeof data === "string" ) {
558
559
			// Make sure leading/trailing whitespace is removed (IE can't handle it)
560
			data = jQuery.trim( data );
561
562
			if ( data ) {
563
				// Make sure the incoming data is actual JSON
564
				// Logic borrowed from http://json.org/json2.js
565
				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
566
					.replace( rvalidtokens, "]" )
567
					.replace( rvalidbraces, "")) ) {
568
569
					return ( new Function( "return " + data ) )();
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
570
				}
571
			}
572
		}
573
574
		jQuery.error( "Invalid JSON: " + data );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
575
	},
576
577
	// Cross-browser xml parsing
578
	parseXML: function( data ) {
579
		var xml, tmp;
580
		if ( !data || typeof data !== "string" ) {
581
			return null;
582
		}
583
		try {
584
			if ( window.DOMParser ) { // Standard
585
				tmp = new DOMParser();
0 ignored issues
show
Bug introduced by
The variable DOMParser seems to be never declared. If this is a global, consider adding a /** global: DOMParser */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
586
				xml = tmp.parseFromString( data , "text/xml" );
587
			} else { // IE
588
				xml = new ActiveXObject( "Microsoft.XMLDOM" );
0 ignored issues
show
Bug introduced by
The variable ActiveXObject seems to be never declared. If this is a global, consider adding a /** global: ActiveXObject */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
589
				xml.async = "false";
590
				xml.loadXML( data );
591
			}
592
		} catch( e ) {
593
			xml = undefined;
594
		}
595
		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
596
			jQuery.error( "Invalid XML: " + data );
597
		}
598
		return xml;
599
	},
600
601
	noop: function() {},
602
603
	// Evaluates a script in a global context
604
	// Workarounds based on findings by Jim Driscoll
605
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
606
	globalEval: function( data ) {
607
		if ( data && jQuery.trim( data ) ) {
608
			// We use execScript on Internet Explorer
609
			// We use an anonymous function so that context is window
610
			// rather than jQuery in Firefox
611
			( window.execScript || function( data ) {
612
				window[ "eval" ].call( window, data );
613
			} )( data );
614
		}
615
	},
616
617
	// Convert dashed to camelCase; used by the css and data modules
618
	// Microsoft forgot to hump their vendor prefix (#9572)
619
	camelCase: function( string ) {
620
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
621
	},
622
623
	nodeName: function( elem, name ) {
624
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
625
	},
626
627
	// args is for internal usage only
628
	each: function( obj, callback, args ) {
629
		var value,
630
			i = 0,
631
			length = obj.length,
632
			isArray = isArraylike( obj );
633
634
		if ( args ) {
635
			if ( isArray ) {
636
				for ( ; i < length; i++ ) {
637
					value = callback.apply( obj[ i ], args );
638
639
					if ( value === false ) {
640
						break;
641
					}
642
				}
643
			} else {
644
				for ( i in obj ) {
645
					value = callback.apply( obj[ i ], args );
646
647
					if ( value === false ) {
648
						break;
649
					}
650
				}
651
			}
652
653
		// A special, fast, case for the most common use of each
654
		} else {
655
			if ( isArray ) {
656
				for ( ; i < length; i++ ) {
657
					value = callback.call( obj[ i ], i, obj[ i ] );
658
659
					if ( value === false ) {
660
						break;
661
					}
662
				}
663
			} else {
664
				for ( i in obj ) {
665
					value = callback.call( obj[ i ], i, obj[ i ] );
666
667
					if ( value === false ) {
668
						break;
669
					}
670
				}
671
			}
672
		}
673
674
		return obj;
675
	},
676
677
	// Use native String.trim function wherever possible
678
	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
679
		function( text ) {
680
			return text == null ?
681
				"" :
682
				core_trim.call( text );
683
		} :
684
685
		// Otherwise use our own trimming functionality
686
		function( text ) {
687
			return text == null ?
688
				"" :
689
				( text + "" ).replace( rtrim, "" );
690
		},
691
692
	// results is for internal usage only
693
	makeArray: function( arr, results ) {
694
		var ret = results || [];
695
696
		if ( arr != null ) {
697
			if ( isArraylike( Object(arr) ) ) {
698
				jQuery.merge( ret,
699
					typeof arr === "string" ?
700
					[ arr ] : arr
701
				);
702
			} else {
703
				core_push.call( ret, arr );
704
			}
705
		}
706
707
		return ret;
708
	},
709
710
	inArray: function( elem, arr, i ) {
711
		var len;
712
713
		if ( arr ) {
714
			if ( core_indexOf ) {
715
				return core_indexOf.call( arr, elem, i );
716
			}
717
718
			len = arr.length;
719
			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
720
721
			for ( ; i < len; i++ ) {
722
				// Skip accessing in sparse arrays
723
				if ( i in arr && arr[ i ] === elem ) {
724
					return i;
725
				}
726
			}
727
		}
728
729
		return -1;
730
	},
731
732
	merge: function( first, second ) {
733
		var l = second.length,
734
			i = first.length,
735
			j = 0;
736
737
		if ( typeof l === "number" ) {
738
			for ( ; j < l; j++ ) {
739
				first[ i++ ] = second[ j ];
740
			}
741
		} else {
742
			while ( second[j] !== undefined ) {
743
				first[ i++ ] = second[ j++ ];
744
			}
745
		}
746
747
		first.length = i;
748
749
		return first;
750
	},
751
752
	grep: function( elems, callback, inv ) {
753
		var retVal,
754
			ret = [],
755
			i = 0,
756
			length = elems.length;
757
		inv = !!inv;
758
759
		// Go through the array, only saving the items
760
		// that pass the validator function
761
		for ( ; i < length; i++ ) {
762
			retVal = !!callback( elems[ i ], i );
763
			if ( inv !== retVal ) {
764
				ret.push( elems[ i ] );
765
			}
766
		}
767
768
		return ret;
769
	},
770
771
	// arg is for internal usage only
772
	map: function( elems, callback, arg ) {
773
		var value,
774
			i = 0,
775
			length = elems.length,
776
			isArray = isArraylike( elems ),
777
			ret = [];
778
779
		// Go through the array, translating each of the items to their
780
		if ( isArray ) {
781
			for ( ; i < length; i++ ) {
782
				value = callback( elems[ i ], i, arg );
783
784
				if ( value != null ) {
785
					ret[ ret.length ] = value;
786
				}
787
			}
788
789
		// Go through every key on the object,
790
		} else {
791
			for ( i in elems ) {
792
				value = callback( elems[ i ], i, arg );
793
794
				if ( value != null ) {
795
					ret[ ret.length ] = value;
796
				}
797
			}
798
		}
799
800
		// Flatten any nested arrays
801
		return core_concat.apply( [], ret );
802
	},
803
804
	// A global GUID counter for objects
805
	guid: 1,
806
807
	// Bind a function to a context, optionally partially applying any
808
	// arguments.
809
	proxy: function( fn, context ) {
810
		var args, proxy, tmp;
811
812
		if ( typeof context === "string" ) {
813
			tmp = fn[ context ];
814
			context = fn;
815
			fn = tmp;
816
		}
817
818
		// Quick check to determine if target is callable, in the spec
819
		// this throws a TypeError, but we will just return undefined.
820
		if ( !jQuery.isFunction( fn ) ) {
821
			return undefined;
822
		}
823
824
		// Simulated bind
825
		args = core_slice.call( arguments, 2 );
826
		proxy = function() {
827
			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
828
		};
829
830
		// Set the guid of unique handler to the same of original handler, so it can be removed
831
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
832
833
		return proxy;
834
	},
835
836
	// Multifunctional method to get and set values of a collection
837
	// The value/s can optionally be executed if it's a function
838
	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
839
		var i = 0,
840
			length = elems.length,
841
			bulk = key == null;
842
843
		// Sets many values
844
		if ( jQuery.type( key ) === "object" ) {
845
			chainable = true;
846
			for ( i in key ) {
847
				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
848
			}
849
850
		// Sets one value
851
		} else if ( value !== undefined ) {
852
			chainable = true;
853
854
			if ( !jQuery.isFunction( value ) ) {
855
				raw = true;
856
			}
857
858
			if ( bulk ) {
859
				// Bulk operations run against the entire set
860
				if ( raw ) {
861
					fn.call( elems, value );
862
					fn = null;
863
864
				// ...except when executing function values
865
				} else {
866
					bulk = fn;
867
					fn = function( elem, key, value ) {
868
						return bulk.call( jQuery( elem ), value );
869
					};
870
				}
871
			}
872
873
			if ( fn ) {
874
				for ( ; i < length; i++ ) {
875
					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
876
				}
877
			}
878
		}
879
880
		return chainable ?
881
			elems :
882
883
			// Gets
884
			bulk ?
885
				fn.call( elems ) :
886
				length ? fn( elems[0], key ) : emptyGet;
887
	},
888
889
	now: function() {
890
		return ( new Date() ).getTime();
891
	},
892
893
	// A method for quickly swapping in/out CSS properties to get correct calculations.
894
	// Note: this method belongs to the css module but it's needed here for the support module.
895
	// If support gets modularized, this method should be moved back to the css module.
896
	swap: function( elem, options, callback, args ) {
897
		var ret, name,
898
			old = {};
899
900
		// Remember the old values, and insert the new ones
901
		for ( name in options ) {
902
			old[ name ] = elem.style[ name ];
903
			elem.style[ name ] = options[ name ];
904
		}
905
906
		ret = callback.apply( elem, args || [] );
907
908
		// Revert the old values
909
		for ( name in options ) {
910
			elem.style[ name ] = old[ name ];
911
		}
912
913
		return ret;
914
	}
915
});
916
917
jQuery.ready.promise = function( obj ) {
918
	if ( !readyList ) {
919
920
		readyList = jQuery.Deferred();
921
922
		// Catch cases where $(document).ready() is called after the browser event has already occurred.
923
		// we once tried to use readyState "interactive" here, but it caused issues like the one
924
		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
925
		if ( document.readyState === "complete" ) {
926
			// Handle it asynchronously to allow scripts the opportunity to delay ready
927
			setTimeout( jQuery.ready );
928
929
		// Standards-based browsers support DOMContentLoaded
930
		} else if ( document.addEventListener ) {
931
			// Use the handy event callback
932
			document.addEventListener( "DOMContentLoaded", completed, false );
933
934
			// A fallback to window.onload, that will always work
935
			window.addEventListener( "load", completed, false );
936
937
		// If IE event model is used
938
		} else {
939
			// Ensure firing before onload, maybe late but safe also for iframes
940
			document.attachEvent( "onreadystatechange", completed );
941
942
			// A fallback to window.onload, that will always work
943
			window.attachEvent( "onload", completed );
944
945
			// If IE and not a frame
946
			// continually check to see if the document is ready
947
			var top = false;
0 ignored issues
show
Unused Code introduced by
The assignment to variable top seems to be never used. Consider removing it.
Loading history...
948
949
			try {
950
				top = window.frameElement == null && document.documentElement;
951
			} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
952
953
			if ( top && top.doScroll ) {
954
				(function doScrollCheck() {
955
					if ( !jQuery.isReady ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !jQuery.isReady is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
956
957
						try {
958
							// Use the trick by Diego Perini
959
							// http://javascript.nwbox.com/IEContentLoaded/
960
							top.doScroll("left");
961
						} catch(e) {
962
							return setTimeout( doScrollCheck, 50 );
963
						}
964
965
						// detach all dom ready events
966
						detach();
967
968
						// and execute any waiting functions
969
						jQuery.ready();
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
970
					}
971
				})();
972
			}
973
		}
974
	}
975
	return readyList.promise( obj );
976
};
977
978
// Populate the class2type map
979
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
980
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
981
});
982
983
function isArraylike( obj ) {
984
	var length = obj.length,
985
		type = jQuery.type( obj );
986
987
	if ( jQuery.isWindow( obj ) ) {
988
		return false;
989
	}
990
991
	if ( obj.nodeType === 1 && length ) {
992
		return true;
993
	}
994
995
	return type === "array" || type !== "function" &&
996
		( length === 0 ||
997
		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
998
}
999
1000
// All jQuery objects should point back to these
1001
rootjQuery = jQuery(document);
1002
/*!
1003
 * Sizzle CSS Selector Engine v1.10.2
1004
 * http://sizzlejs.com/
1005
 *
1006
 * Copyright 2013 jQuery Foundation, Inc. and other contributors
1007
 * Released under the MIT license
1008
 * http://jquery.org/license
1009
 *
1010
 * Date: 2013-07-03
1011
 */
1012
(function( window, undefined ) {
1013
1014
var i,
1015
	support,
1016
	cachedruns,
1017
	Expr,
1018
	getText,
1019
	isXML,
1020
	compile,
1021
	outermostContext,
1022
	sortInput,
1023
1024
	// Local document vars
1025
	setDocument,
1026
	document,
1027
	docElem,
1028
	documentIsHTML,
1029
	rbuggyQSA,
1030
	rbuggyMatches,
1031
	matches,
1032
	contains,
1033
1034
	// Instance-specific data
1035
	expando = "sizzle" + -(new Date()),
1036
	preferredDoc = window.document,
1037
	dirruns = 0,
1038
	done = 0,
1039
	classCache = createCache(),
1040
	tokenCache = createCache(),
1041
	compilerCache = createCache(),
1042
	hasDuplicate = false,
1043
	sortOrder = function( a, b ) {
1044
		if ( a === b ) {
1045
			hasDuplicate = true;
1046
			return 0;
1047
		}
1048
		return 0;
1049
	},
1050
1051
	// General-purpose constants
1052
	strundefined = typeof undefined,
1053
	MAX_NEGATIVE = 1 << 31,
1054
1055
	// Instance methods
1056
	hasOwn = ({}).hasOwnProperty,
1057
	arr = [],
1058
	pop = arr.pop,
1059
	push_native = arr.push,
1060
	push = arr.push,
1061
	slice = arr.slice,
1062
	// Use a stripped-down indexOf if we can't use a native one
1063
	indexOf = arr.indexOf || function( elem ) {
1064
		var i = 0,
1065
			len = this.length;
1066
		for ( ; i < len; i++ ) {
1067
			if ( this[i] === elem ) {
1068
				return i;
1069
			}
1070
		}
1071
		return -1;
1072
	},
1073
1074
	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
1075
1076
	// Regular expressions
1077
1078
	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
1079
	whitespace = "[\\x20\\t\\r\\n\\f]",
1080
	// http://www.w3.org/TR/css3-syntax/#characters
1081
	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
1082
1083
	// Loosely modeled on CSS identifier characters
1084
	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
1085
	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
1086
	identifier = characterEncoding.replace( "w", "w#" ),
1087
1088
	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
1089
	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
1090
		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
1091
1092
	// Prefer arguments quoted,
1093
	//   then not containing pseudos/brackets,
1094
	//   then attribute selectors/non-parenthetical expressions,
1095
	//   then anything else
1096
	// These preferences are here to reduce the number of selectors
1097
	//   needing tokenize in the PSEUDO preFilter
1098
	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
1099
1100
	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
1101
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
1102
1103
	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
1104
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
1105
1106
	rsibling = new RegExp( whitespace + "*[+~]" ),
1107
	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
1108
1109
	rpseudo = new RegExp( pseudos ),
1110
	ridentifier = new RegExp( "^" + identifier + "$" ),
1111
1112
	matchExpr = {
1113
		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
1114
		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
1115
		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
1116
		"ATTR": new RegExp( "^" + attributes ),
1117
		"PSEUDO": new RegExp( "^" + pseudos ),
1118
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
1119
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
1120
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
1121
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
1122
		// For use in libraries implementing .is()
1123
		// We use this for POS matching in `select`
1124
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
1125
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
1126
	},
1127
1128
	rnative = /^[^{]+\{\s*\[native \w/,
1129
1130
	// Easily-parseable/retrievable ID or TAG or CLASS selectors
1131
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
1132
1133
	rinputs = /^(?:input|select|textarea|button)$/i,
1134
	rheader = /^h\d$/i,
1135
1136
	rescape = /'|\\/g,
1137
1138
	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
1139
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
1140
	funescape = function( _, escaped, escapedWhitespace ) {
1141
		var high = "0x" + escaped - 0x10000;
1142
		// NaN means non-codepoint
1143
		// Support: Firefox
1144
		// Workaround erroneous numeric interpretation of +"0x"
1145
		return high !== high || escapedWhitespace ?
1146
			escaped :
1147
			// BMP codepoint
1148
			high < 0 ?
1149
				String.fromCharCode( high + 0x10000 ) :
1150
				// Supplemental Plane codepoint (surrogate pair)
1151
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
1152
	};
1153
1154
// Optimize for push.apply( _, NodeList )
1155
try {
1156
	push.apply(
1157
		(arr = slice.call( preferredDoc.childNodes )),
1158
		preferredDoc.childNodes
1159
	);
1160
	// Support: Android<4.0
1161
	// Detect silently failing push.apply
1162
	arr[ preferredDoc.childNodes.length ].nodeType;
0 ignored issues
show
introduced by
The result of the property access to arr.preferredDoc.childNodes.length.nodeType is not used.
Loading history...
1163
} catch ( e ) {
1164
	push = { apply: arr.length ?
1165
1166
		// Leverage slice if possible
1167
		function( target, els ) {
1168
			push_native.apply( target, slice.call(els) );
1169
		} :
1170
1171
		// Support: IE<9
1172
		// Otherwise append directly
1173
		function( target, els ) {
1174
			var j = target.length,
1175
				i = 0;
1176
			// Can't trust NodeList.length
1177
			while ( (target[j++] = els[i++]) ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
1178
			target.length = j - 1;
1179
		}
1180
	};
1181
}
1182
1183
function Sizzle( selector, context, results, seed ) {
1184
	var match, elem, m, nodeType,
1185
		// QSA vars
1186
		i, groups, old, nid, newContext, newSelector;
1187
1188
	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
1189
		setDocument( context );
1190
	}
1191
1192
	context = context || document;
1193
	results = results || [];
1194
1195
	if ( !selector || typeof selector !== "string" ) {
1196
		return results;
1197
	}
1198
1199
	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
1200
		return [];
1201
	}
1202
1203
	if ( documentIsHTML && !seed ) {
1204
1205
		// Shortcuts
1206
		if ( (match = rquickExpr.exec( selector )) ) {
1207
			// Speed-up: Sizzle("#ID")
1208
			if ( (m = match[1]) ) {
1209
				if ( nodeType === 9 ) {
1210
					elem = context.getElementById( m );
1211
					// Check parentNode to catch when Blackberry 4.6 returns
1212
					// nodes that are no longer in the document #6963
1213
					if ( elem && elem.parentNode ) {
1214
						// Handle the case where IE, Opera, and Webkit return items
1215
						// by name instead of ID
1216
						if ( elem.id === m ) {
1217
							results.push( elem );
1218
							return results;
1219
						}
1220
					} else {
1221
						return results;
1222
					}
1223
				} else {
1224
					// Context is not a document
1225
					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
1226
						contains( context, elem ) && elem.id === m ) {
1227
						results.push( elem );
1228
						return results;
1229
					}
1230
				}
1231
1232
			// Speed-up: Sizzle("TAG")
1233
			} else if ( match[2] ) {
1234
				push.apply( results, context.getElementsByTagName( selector ) );
1235
				return results;
1236
1237
			// Speed-up: Sizzle(".CLASS")
1238
			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
1239
				push.apply( results, context.getElementsByClassName( m ) );
1240
				return results;
1241
			}
1242
		}
1243
1244
		// QSA path
1245
		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1246
			nid = old = expando;
1247
			newContext = context;
1248
			newSelector = nodeType === 9 && selector;
1249
1250
			// qSA works strangely on Element-rooted queries
1251
			// We can work around this by specifying an extra ID on the root
1252
			// and working up from there (Thanks to Andrew Dupont for the technique)
1253
			// IE 8 doesn't work on object elements
1254
			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
1255
				groups = tokenize( selector );
1256
1257
				if ( (old = context.getAttribute("id")) ) {
1258
					nid = old.replace( rescape, "\\$&" );
1259
				} else {
1260
					context.setAttribute( "id", nid );
1261
				}
1262
				nid = "[id='" + nid + "'] ";
1263
1264
				i = groups.length;
1265
				while ( i-- ) {
1266
					groups[i] = nid + toSelector( groups[i] );
1267
				}
1268
				newContext = rsibling.test( selector ) && context.parentNode || context;
1269
				newSelector = groups.join(",");
1270
			}
1271
1272
			if ( newSelector ) {
1273
				try {
1274
					push.apply( results,
1275
						newContext.querySelectorAll( newSelector )
1276
					);
1277
					return results;
1278
				} catch(qsaError) {
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1279
				} finally {
1280
					if ( !old ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !old is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1281
						context.removeAttribute("id");
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1282
					}
1283
				}
1284
			}
1285
		}
1286
	}
1287
1288
	// All others
1289
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
1290
}
1291
1292
/**
1293
 * Create key-value caches of limited size
1294
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
1295
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
1296
 *	deleting the oldest entry
1297
 */
1298
function createCache() {
1299
	var keys = [];
1300
1301
	function cache( key, value ) {
1302
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1303
		if ( keys.push( key += " " ) > Expr.cacheLength ) {
1304
			// Only keep the most recent entries
1305
			delete cache[ keys.shift() ];
1306
		}
1307
		return (cache[ key ] = value);
1308
	}
1309
	return cache;
1310
}
1311
1312
/**
1313
 * Mark a function for special use by Sizzle
1314
 * @param {Function} fn The function to mark
1315
 */
1316
function markFunction( fn ) {
1317
	fn[ expando ] = true;
1318
	return fn;
1319
}
1320
1321
/**
1322
 * Support testing using an element
1323
 * @param {Function} fn Passed the created div and expects a boolean result
1324
 */
1325
function assert( fn ) {
1326
	var div = document.createElement("div");
1327
1328
	try {
1329
		return !!fn( div );
1330
	} catch (e) {
1331
		return false;
1332
	} finally {
1333
		// Remove from its parent by default
1334
		if ( div.parentNode ) {
1335
			div.parentNode.removeChild( div );
1336
		}
1337
		// release memory in IE
1338
		div = null;
0 ignored issues
show
Unused Code introduced by
The assignment to div seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
1339
	}
1340
}
1341
1342
/**
1343
 * Adds the same handler for all of the specified attrs
1344
 * @param {String} attrs Pipe-separated list of attributes
1345
 * @param {Function} handler The method that will be applied
1346
 */
1347
function addHandle( attrs, handler ) {
1348
	var arr = attrs.split("|"),
1349
		i = attrs.length;
1350
1351
	while ( i-- ) {
1352
		Expr.attrHandle[ arr[i] ] = handler;
1353
	}
1354
}
1355
1356
/**
1357
 * Checks document order of two siblings
1358
 * @param {Element} a
1359
 * @param {Element} b
1360
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1361
 */
1362
function siblingCheck( a, b ) {
1363
	var cur = b && a,
1364
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1365
			( ~b.sourceIndex || MAX_NEGATIVE ) -
1366
			( ~a.sourceIndex || MAX_NEGATIVE );
1367
1368
	// Use IE sourceIndex if available on both nodes
1369
	if ( diff ) {
1370
		return diff;
1371
	}
1372
1373
	// Check if b follows a
1374
	if ( cur ) {
1375
		while ( (cur = cur.nextSibling) ) {
1376
			if ( cur === b ) {
1377
				return -1;
1378
			}
1379
		}
1380
	}
1381
1382
	return a ? 1 : -1;
1383
}
1384
1385
/**
1386
 * Returns a function to use in pseudos for input types
1387
 * @param {String} type
1388
 */
1389
function createInputPseudo( type ) {
1390
	return function( elem ) {
1391
		var name = elem.nodeName.toLowerCase();
1392
		return name === "input" && elem.type === type;
1393
	};
1394
}
1395
1396
/**
1397
 * Returns a function to use in pseudos for buttons
1398
 * @param {String} type
1399
 */
1400
function createButtonPseudo( type ) {
1401
	return function( elem ) {
1402
		var name = elem.nodeName.toLowerCase();
1403
		return (name === "input" || name === "button") && elem.type === type;
1404
	};
1405
}
1406
1407
/**
1408
 * Returns a function to use in pseudos for positionals
1409
 * @param {Function} fn
1410
 */
1411
function createPositionalPseudo( fn ) {
1412
	return markFunction(function( argument ) {
1413
		argument = +argument;
1414
		return markFunction(function( seed, matches ) {
1415
			var j,
1416
				matchIndexes = fn( [], seed.length, argument ),
1417
				i = matchIndexes.length;
1418
1419
			// Match elements found at the specified indexes
1420
			while ( i-- ) {
1421
				if ( seed[ (j = matchIndexes[i]) ] ) {
1422
					seed[j] = !(matches[j] = seed[j]);
1423
				}
1424
			}
1425
		});
1426
	});
1427
}
1428
1429
/**
1430
 * Detect xml
1431
 * @param {Element|Object} elem An element or a document
1432
 */
1433
isXML = Sizzle.isXML = function( elem ) {
1434
	// documentElement is verified for cases where it doesn't yet exist
1435
	// (such as loading iframes in IE - #4833)
1436
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1437
	return documentElement ? documentElement.nodeName !== "HTML" : false;
1438
};
1439
1440
// Expose support vars for convenience
1441
support = Sizzle.support = {};
1442
1443
/**
1444
 * Sets document-related variables once based on the current document
1445
 * @param {Element|Object} [doc] An element or document object to use to set the document
0 ignored issues
show
Documentation introduced by
The parameter doc does not exist. Did you maybe forget to remove this comment?
Loading history...
1446
 * @returns {Object} Returns the current document
1447
 */
1448
setDocument = Sizzle.setDocument = function( node ) {
1449
	var doc = node ? node.ownerDocument || node : preferredDoc,
1450
		parent = doc.defaultView;
1451
1452
	// If no document and documentElement is available, return
1453
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1454
		return document;
1455
	}
1456
1457
	// Set our document
1458
	document = doc;
1459
	docElem = doc.documentElement;
1460
1461
	// Support tests
1462
	documentIsHTML = !isXML( doc );
1463
1464
	// Support: IE>8
1465
	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
1466
	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1467
	// IE6-8 do not support the defaultView property so parent will be undefined
1468
	if ( parent && parent.attachEvent && parent !== parent.top ) {
1469
		parent.attachEvent( "onbeforeunload", function() {
1470
			setDocument();
1471
		});
1472
	}
1473
1474
	/* Attributes
1475
	---------------------------------------------------------------------- */
1476
1477
	// Support: IE<8
1478
	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
1479
	support.attributes = assert(function( div ) {
1480
		div.className = "i";
1481
		return !div.getAttribute("className");
1482
	});
1483
1484
	/* getElement(s)By*
1485
	---------------------------------------------------------------------- */
1486
1487
	// Check if getElementsByTagName("*") returns only elements
1488
	support.getElementsByTagName = assert(function( div ) {
1489
		div.appendChild( doc.createComment("") );
1490
		return !div.getElementsByTagName("*").length;
1491
	});
1492
1493
	// Check if getElementsByClassName can be trusted
1494
	support.getElementsByClassName = assert(function( div ) {
1495
		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
1496
1497
		// Support: Safari<4
1498
		// Catch class over-caching
1499
		div.firstChild.className = "i";
1500
		// Support: Opera<10
1501
		// Catch gEBCN failure to find non-leading classes
1502
		return div.getElementsByClassName("i").length === 2;
1503
	});
1504
1505
	// Support: IE<10
1506
	// Check if getElementById returns elements by name
1507
	// The broken getElementById methods don't pick up programatically-set names,
1508
	// so use a roundabout getElementsByName test
1509
	support.getById = assert(function( div ) {
1510
		docElem.appendChild( div ).id = expando;
1511
		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1512
	});
1513
1514
	// ID find and filter
1515
	if ( support.getById ) {
1516
		Expr.find["ID"] = function( id, context ) {
1517
			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...fined && documentIsHTML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1518
				var m = context.getElementById( id );
1519
				// Check parentNode to catch when Blackberry 4.6 returns
1520
				// nodes that are no longer in the document #6963
1521
				return m && m.parentNode ? [m] : [];
1522
			}
1523
		};
1524
		Expr.filter["ID"] = function( id ) {
1525
			var attrId = id.replace( runescape, funescape );
1526
			return function( elem ) {
1527
				return elem.getAttribute("id") === attrId;
1528
			};
1529
		};
1530
	} else {
1531
		// Support: IE6/7
1532
		// getElementById is not reliable as a find shortcut
1533
		delete Expr.find["ID"];
1534
1535
		Expr.filter["ID"] =  function( id ) {
1536
			var attrId = id.replace( runescape, funescape );
1537
			return function( elem ) {
1538
				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
1539
				return node && node.value === attrId;
1540
			};
1541
		};
1542
	}
1543
1544
	// Tag
1545
	Expr.find["TAG"] = support.getElementsByTagName ?
1546
		function( tag, context ) {
1547
			if ( typeof context.getElementsByTagName !== strundefined ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...gName !== strundefined is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1548
				return context.getElementsByTagName( tag );
1549
			}
1550
		} :
1551
		function( tag, context ) {
1552
			var elem,
1553
				tmp = [],
1554
				i = 0,
1555
				results = context.getElementsByTagName( tag );
1556
1557
			// Filter out possible comments
1558
			if ( tag === "*" ) {
1559
				while ( (elem = results[i++]) ) {
1560
					if ( elem.nodeType === 1 ) {
1561
						tmp.push( elem );
1562
					}
1563
				}
1564
1565
				return tmp;
1566
			}
1567
			return results;
1568
		};
1569
1570
	// Class
1571
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1572
		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...fined && documentIsHTML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1573
			return context.getElementsByClassName( className );
1574
		}
1575
	};
1576
1577
	/* QSA/matchesSelector
1578
	---------------------------------------------------------------------- */
1579
1580
	// QSA and matchesSelector support
1581
1582
	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1583
	rbuggyMatches = [];
1584
1585
	// qSa(:focus) reports false when true (Chrome 21)
1586
	// We allow this because of a bug in IE8/9 that throws an error
1587
	// whenever `document.activeElement` is accessed on an iframe
1588
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1589
	// See http://bugs.jquery.com/ticket/13378
1590
	rbuggyQSA = [];
1591
1592
	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1593
		// Build QSA regex
1594
		// Regex strategy adopted from Diego Perini
1595
		assert(function( div ) {
1596
			// Select is set to empty string on purpose
1597
			// This is to test IE's treatment of not explicitly
1598
			// setting a boolean content attribute,
1599
			// since its presence should be enough
1600
			// http://bugs.jquery.com/ticket/12359
1601
			div.innerHTML = "<select><option selected=''></option></select>";
1602
1603
			// Support: IE8
1604
			// Boolean attributes and "value" are not treated correctly
1605
			if ( !div.querySelectorAll("[selected]").length ) {
1606
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1607
			}
1608
1609
			// Webkit/Opera - :checked should return selected option elements
1610
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1611
			// IE8 throws error here and will not see later tests
1612
			if ( !div.querySelectorAll(":checked").length ) {
1613
				rbuggyQSA.push(":checked");
1614
			}
1615
		});
1616
1617
		assert(function( div ) {
1618
1619
			// Support: Opera 10-12/IE8
1620
			// ^= $= *= and empty values
1621
			// Should not select anything
1622
			// Support: Windows 8 Native Apps
1623
			// The type attribute is restricted during .innerHTML assignment
1624
			var input = doc.createElement("input");
1625
			input.setAttribute( "type", "hidden" );
1626
			div.appendChild( input ).setAttribute( "t", "" );
1627
1628
			if ( div.querySelectorAll("[t^='']").length ) {
1629
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1630
			}
1631
1632
			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1633
			// IE8 throws error here and will not see later tests
1634
			if ( !div.querySelectorAll(":enabled").length ) {
1635
				rbuggyQSA.push( ":enabled", ":disabled" );
1636
			}
1637
1638
			// Opera 10-11 does not throw on post-comma invalid pseudos
1639
			div.querySelectorAll("*,:x");
1640
			rbuggyQSA.push(",.*:");
1641
		});
1642
	}
1643
1644
	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
1645
		docElem.mozMatchesSelector ||
1646
		docElem.oMatchesSelector ||
1647
		docElem.msMatchesSelector) )) ) {
1648
1649
		assert(function( div ) {
1650
			// Check to see if it's possible to do matchesSelector
1651
			// on a disconnected node (IE 9)
1652
			support.disconnectedMatch = matches.call( div, "div" );
1653
1654
			// This should fail with an exception
1655
			// Gecko does not error, returns false instead
1656
			matches.call( div, "[s!='']:x" );
1657
			rbuggyMatches.push( "!=", pseudos );
1658
		});
1659
	}
1660
1661
	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1662
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1663
1664
	/* Contains
1665
	---------------------------------------------------------------------- */
1666
1667
	// Element contains another
1668
	// Purposefully does not implement inclusive descendent
1669
	// As in, an element does not contain itself
1670
	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
1671
		function( a, b ) {
1672
			var adown = a.nodeType === 9 ? a.documentElement : a,
1673
				bup = b && b.parentNode;
1674
			return a === bup || !!( bup && bup.nodeType === 1 && (
1675
				adown.contains ?
1676
					adown.contains( bup ) :
1677
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1678
			));
1679
		} :
1680
		function( a, b ) {
1681
			if ( b ) {
1682
				while ( (b = b.parentNode) ) {
1683
					if ( b === a ) {
1684
						return true;
1685
					}
1686
				}
1687
			}
1688
			return false;
1689
		};
1690
1691
	/* Sorting
1692
	---------------------------------------------------------------------- */
1693
1694
	// Document order sorting
1695
	sortOrder = docElem.compareDocumentPosition ?
1696
	function( a, b ) {
1697
1698
		// Flag for duplicate removal
1699
		if ( a === b ) {
1700
			hasDuplicate = true;
1701
			return 0;
1702
		}
1703
1704
		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
1705
1706
		if ( compare ) {
1707
			// Disconnected nodes
1708
			if ( compare & 1 ||
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
1709
				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1710
1711
				// Choose the first element that is related to our preferred document
1712
				if ( a === doc || contains(preferredDoc, a) ) {
1713
					return -1;
1714
				}
1715
				if ( b === doc || contains(preferredDoc, b) ) {
1716
					return 1;
1717
				}
1718
1719
				// Maintain original order
1720
				return sortInput ?
1721
					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1722
					0;
1723
			}
1724
1725
			return compare & 4 ? -1 : 1;
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
1726
		}
1727
1728
		// Not directly comparable, sort on existence of method
1729
		return a.compareDocumentPosition ? -1 : 1;
1730
	} :
1731
	function( a, b ) {
1732
		var cur,
1733
			i = 0,
1734
			aup = a.parentNode,
1735
			bup = b.parentNode,
1736
			ap = [ a ],
1737
			bp = [ b ];
1738
1739
		// Exit early if the nodes are identical
1740
		if ( a === b ) {
1741
			hasDuplicate = true;
1742
			return 0;
1743
1744
		// Parentless nodes are either documents or disconnected
1745
		} else if ( !aup || !bup ) {
1746
			return a === doc ? -1 :
1747
				b === doc ? 1 :
1748
				aup ? -1 :
1749
				bup ? 1 :
1750
				sortInput ?
1751
				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1752
				0;
1753
1754
		// If the nodes are siblings, we can do a quick check
1755
		} else if ( aup === bup ) {
1756
			return siblingCheck( a, b );
1757
		}
1758
1759
		// Otherwise we need full lists of their ancestors for comparison
1760
		cur = a;
1761
		while ( (cur = cur.parentNode) ) {
1762
			ap.unshift( cur );
1763
		}
1764
		cur = b;
1765
		while ( (cur = cur.parentNode) ) {
1766
			bp.unshift( cur );
1767
		}
1768
1769
		// Walk down the tree looking for a discrepancy
1770
		while ( ap[i] === bp[i] ) {
1771
			i++;
1772
		}
1773
1774
		return i ?
1775
			// Do a sibling check if the nodes have a common ancestor
1776
			siblingCheck( ap[i], bp[i] ) :
1777
1778
			// Otherwise nodes in our document sort first
1779
			ap[i] === preferredDoc ? -1 :
1780
			bp[i] === preferredDoc ? 1 :
1781
			0;
1782
	};
1783
1784
	return doc;
1785
};
1786
1787
Sizzle.matches = function( expr, elements ) {
1788
	return Sizzle( expr, null, null, elements );
1789
};
1790
1791
Sizzle.matchesSelector = function( elem, expr ) {
1792
	// Set document vars if needed
1793
	if ( ( elem.ownerDocument || elem ) !== document ) {
1794
		setDocument( elem );
1795
	}
1796
1797
	// Make sure that attribute selectors are quoted
1798
	expr = expr.replace( rattributeQuotes, "='$1']" );
1799
1800
	if ( support.matchesSelector && documentIsHTML &&
1801
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1802
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1803
1804
		try {
1805
			var ret = matches.call( elem, expr );
1806
1807
			// IE 9's matchesSelector returns false on disconnected nodes
1808
			if ( ret || support.disconnectedMatch ||
1809
					// As well, disconnected nodes are said to be in a document
1810
					// fragment in IE 9
1811
					elem.document && elem.document.nodeType !== 11 ) {
1812
				return ret;
1813
			}
1814
		} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1815
	}
1816
1817
	return Sizzle( expr, document, null, [elem] ).length > 0;
1818
};
1819
1820
Sizzle.contains = function( context, elem ) {
1821
	// Set document vars if needed
1822
	if ( ( context.ownerDocument || context ) !== document ) {
1823
		setDocument( context );
1824
	}
1825
	return contains( context, elem );
1826
};
1827
1828
Sizzle.attr = function( elem, name ) {
1829
	// Set document vars if needed
1830
	if ( ( elem.ownerDocument || elem ) !== document ) {
1831
		setDocument( elem );
1832
	}
1833
1834
	var fn = Expr.attrHandle[ name.toLowerCase() ],
1835
		// Don't get fooled by Object.prototype properties (jQuery #13807)
1836
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1837
			fn( elem, name, !documentIsHTML ) :
1838
			undefined;
1839
1840
	return val === undefined ?
1841
		support.attributes || !documentIsHTML ?
1842
			elem.getAttribute( name ) :
1843
			(val = elem.getAttributeNode(name)) && val.specified ?
1844
				val.value :
1845
				null :
1846
		val;
1847
};
1848
1849
Sizzle.error = function( msg ) {
1850
	throw new Error( "Syntax error, unrecognized expression: " + msg );
1851
};
1852
1853
/**
1854
 * Document sorting and removing duplicates
1855
 * @param {ArrayLike} results
1856
 */
1857
Sizzle.uniqueSort = function( results ) {
1858
	var elem,
1859
		duplicates = [],
1860
		j = 0,
1861
		i = 0;
1862
1863
	// Unless we *know* we can detect duplicates, assume their presence
1864
	hasDuplicate = !support.detectDuplicates;
1865
	sortInput = !support.sortStable && results.slice( 0 );
1866
	results.sort( sortOrder );
1867
1868
	if ( hasDuplicate ) {
1869
		while ( (elem = results[i++]) ) {
1870
			if ( elem === results[ i ] ) {
1871
				j = duplicates.push( i );
1872
			}
1873
		}
1874
		while ( j-- ) {
1875
			results.splice( duplicates[ j ], 1 );
1876
		}
1877
	}
1878
1879
	return results;
1880
};
1881
1882
/**
1883
 * Utility function for retrieving the text value of an array of DOM nodes
1884
 * @param {Array|Element} elem
1885
 */
1886
getText = Sizzle.getText = function( elem ) {
1887
	var node,
1888
		ret = "",
1889
		i = 0,
1890
		nodeType = elem.nodeType;
1891
1892
	if ( !nodeType ) {
1893
		// If no nodeType, this is expected to be an array
1894
		for ( ; (node = elem[i]); i++ ) {
1895
			// Do not traverse comment nodes
1896
			ret += getText( node );
1897
		}
1898
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1899
		// Use textContent for elements
1900
		// innerText usage removed for consistency of new lines (see #11153)
1901
		if ( typeof elem.textContent === "string" ) {
1902
			return elem.textContent;
1903
		} else {
1904
			// Traverse its children
1905
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1906
				ret += getText( elem );
1907
			}
1908
		}
1909
	} else if ( nodeType === 3 || nodeType === 4 ) {
1910
		return elem.nodeValue;
1911
	}
1912
	// Do not include comment or processing instruction nodes
1913
1914
	return ret;
1915
};
1916
1917
Expr = Sizzle.selectors = {
1918
1919
	// Can be adjusted by the user
1920
	cacheLength: 50,
1921
1922
	createPseudo: markFunction,
1923
1924
	match: matchExpr,
1925
1926
	attrHandle: {},
1927
1928
	find: {},
1929
1930
	relative: {
1931
		">": { dir: "parentNode", first: true },
1932
		" ": { dir: "parentNode" },
1933
		"+": { dir: "previousSibling", first: true },
1934
		"~": { dir: "previousSibling" }
1935
	},
1936
1937
	preFilter: {
1938
		"ATTR": function( match ) {
1939
			match[1] = match[1].replace( runescape, funescape );
1940
1941
			// Move the given value to match[3] whether quoted or unquoted
1942
			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
1943
1944
			if ( match[2] === "~=" ) {
1945
				match[3] = " " + match[3] + " ";
1946
			}
1947
1948
			return match.slice( 0, 4 );
1949
		},
1950
1951
		"CHILD": function( match ) {
1952
			/* matches from matchExpr["CHILD"]
1953
				1 type (only|nth|...)
1954
				2 what (child|of-type)
1955
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1956
				4 xn-component of xn+y argument ([+-]?\d*n|)
1957
				5 sign of xn-component
1958
				6 x of xn-component
1959
				7 sign of y-component
1960
				8 y of y-component
1961
			*/
1962
			match[1] = match[1].toLowerCase();
1963
1964
			if ( match[1].slice( 0, 3 ) === "nth" ) {
1965
				// nth-* requires argument
1966
				if ( !match[3] ) {
1967
					Sizzle.error( match[0] );
1968
				}
1969
1970
				// numeric x and y parameters for Expr.filter.CHILD
1971
				// remember that false/true cast respectively to 0/1
1972
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1973
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1974
1975
			// other types prohibit arguments
1976
			} else if ( match[3] ) {
1977
				Sizzle.error( match[0] );
1978
			}
1979
1980
			return match;
1981
		},
1982
1983
		"PSEUDO": function( match ) {
1984
			var excess,
1985
				unquoted = !match[5] && match[2];
1986
1987
			if ( matchExpr["CHILD"].test( match[0] ) ) {
1988
				return null;
1989
			}
1990
1991
			// Accept quoted arguments as-is
1992
			if ( match[3] && match[4] !== undefined ) {
1993
				match[2] = match[4];
1994
1995
			// Strip excess characters from unquoted arguments
1996
			} else if ( unquoted && rpseudo.test( unquoted ) &&
1997
				// Get excess from tokenize (recursively)
1998
				(excess = tokenize( unquoted, true )) &&
1999
				// advance to the next closing parenthesis
2000
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
2001
2002
				// excess is a negative index
2003
				match[0] = match[0].slice( 0, excess );
2004
				match[2] = unquoted.slice( 0, excess );
2005
			}
2006
2007
			// Return only captures needed by the pseudo filter method (type and argument)
2008
			return match.slice( 0, 3 );
2009
		}
2010
	},
2011
2012
	filter: {
2013
2014
		"TAG": function( nodeNameSelector ) {
2015
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
2016
			return nodeNameSelector === "*" ?
2017
				function() { return true; } :
2018
				function( elem ) {
2019
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
2020
				};
2021
		},
2022
2023
		"CLASS": function( className ) {
2024
			var pattern = classCache[ className + " " ];
2025
2026
			return pattern ||
2027
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
2028
				classCache( className, function( elem ) {
2029
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
2030
				});
2031
		},
2032
2033
		"ATTR": function( name, operator, check ) {
2034
			return function( elem ) {
2035
				var result = Sizzle.attr( elem, name );
2036
2037
				if ( result == null ) {
2038
					return operator === "!=";
2039
				}
2040
				if ( !operator ) {
2041
					return true;
2042
				}
2043
2044
				result += "";
2045
2046
				return operator === "=" ? result === check :
2047
					operator === "!=" ? result !== check :
2048
					operator === "^=" ? check && result.indexOf( check ) === 0 :
2049
					operator === "*=" ? check && result.indexOf( check ) > -1 :
2050
					operator === "$=" ? check && result.slice( -check.length ) === check :
2051
					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
2052
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
2053
					false;
2054
			};
2055
		},
2056
2057
		"CHILD": function( type, what, argument, first, last ) {
2058
			var simple = type.slice( 0, 3 ) !== "nth",
2059
				forward = type.slice( -4 ) !== "last",
2060
				ofType = what === "of-type";
2061
2062
			return first === 1 && last === 0 ?
2063
2064
				// Shortcut for :nth-*(n)
2065
				function( elem ) {
2066
					return !!elem.parentNode;
2067
				} :
2068
2069
				function( elem, context, xml ) {
2070
					var cache, outerCache, node, diff, nodeIndex, start,
2071
						dir = simple !== forward ? "nextSibling" : "previousSibling",
2072
						parent = elem.parentNode,
2073
						name = ofType && elem.nodeName.toLowerCase(),
2074
						useCache = !xml && !ofType;
2075
2076
					if ( parent ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if parent is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2077
2078
						// :(first|last|only)-(child|of-type)
2079
						if ( simple ) {
2080
							while ( dir ) {
2081
								node = elem;
2082
								while ( (node = node[ dir ]) ) {
2083
									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
2084
										return false;
2085
									}
2086
								}
2087
								// Reverse direction for :only-* (if we haven't yet done so)
2088
								start = dir = type === "only" && !start && "nextSibling";
2089
							}
2090
							return true;
2091
						}
2092
2093
						start = [ forward ? parent.firstChild : parent.lastChild ];
2094
2095
						// non-xml :nth-child(...) stores cache data on `parent`
2096
						if ( forward && useCache ) {
2097
							// Seek `elem` from a previously-cached index
2098
							outerCache = parent[ expando ] || (parent[ expando ] = {});
2099
							cache = outerCache[ type ] || [];
2100
							nodeIndex = cache[0] === dirruns && cache[1];
2101
							diff = cache[0] === dirruns && cache[2];
2102
							node = nodeIndex && parent.childNodes[ nodeIndex ];
2103
2104
							while ( (node = ++nodeIndex && node && node[ dir ] ||
2105
2106
								// Fallback to seeking `elem` from the start
2107
								(diff = nodeIndex = 0) || start.pop()) ) {
2108
2109
								// When found, cache indexes on `parent` and break
2110
								if ( node.nodeType === 1 && ++diff && node === elem ) {
2111
									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
2112
									break;
2113
								}
2114
							}
2115
2116
						// Use previously-cached element index if available
2117
						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
2118
							diff = cache[1];
2119
2120
						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
2121
						} else {
2122
							// Use the same loop as above to seek `elem` from the start
2123
							while ( (node = ++nodeIndex && node && node[ dir ] ||
0 ignored issues
show
Comprehensibility Bug introduced by
The variable nodeIndex does not seem to be initialized in case the while loop on line 2123 is not entered. Are you sure this can never be the case?
Loading history...
2124
								(diff = nodeIndex = 0) || start.pop()) ) {
2125
2126
								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
0 ignored issues
show
Bug introduced by
The variable diff seems to not be initialized for all possible execution paths.
Loading history...
2127
									// Cache the index of each encountered element
2128
									if ( useCache ) {
2129
										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
2130
									}
2131
2132
									if ( node === elem ) {
2133
										break;
2134
									}
2135
								}
2136
							}
2137
						}
2138
2139
						// Incorporate the offset, then check against cycle size
2140
						diff -= last;
2141
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2142
					}
2143
				};
2144
		},
2145
2146
		"PSEUDO": function( pseudo, argument ) {
2147
			// pseudo-class names are case-insensitive
2148
			// http://www.w3.org/TR/selectors/#pseudo-classes
2149
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2150
			// Remember that setFilters inherits from pseudos
2151
			var args,
2152
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2153
					Sizzle.error( "unsupported pseudo: " + pseudo );
2154
2155
			// The user may use createPseudo to indicate that
2156
			// arguments are needed to create the filter function
2157
			// just as Sizzle does
2158
			if ( fn[ expando ] ) {
2159
				return fn( argument );
2160
			}
2161
2162
			// But maintain support for old signatures
2163
			if ( fn.length > 1 ) {
2164
				args = [ pseudo, pseudo, "", argument ];
2165
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2166
					markFunction(function( seed, matches ) {
2167
						var idx,
2168
							matched = fn( seed, argument ),
2169
							i = matched.length;
2170
						while ( i-- ) {
2171
							idx = indexOf.call( seed, matched[i] );
2172
							seed[ idx ] = !( matches[ idx ] = matched[i] );
2173
						}
2174
					}) :
2175
					function( elem ) {
2176
						return fn( elem, 0, args );
2177
					};
2178
			}
2179
2180
			return fn;
2181
		}
2182
	},
2183
2184
	pseudos: {
2185
		// Potentially complex pseudos
2186
		"not": markFunction(function( selector ) {
2187
			// Trim the selector passed to compile
2188
			// to avoid treating leading and trailing
2189
			// spaces as combinators
2190
			var input = [],
2191
				results = [],
2192
				matcher = compile( selector.replace( rtrim, "$1" ) );
2193
2194
			return matcher[ expando ] ?
2195
				markFunction(function( seed, matches, context, xml ) {
2196
					var elem,
2197
						unmatched = matcher( seed, null, xml, [] ),
2198
						i = seed.length;
2199
2200
					// Match elements unmatched by `matcher`
2201
					while ( i-- ) {
2202
						if ( (elem = unmatched[i]) ) {
2203
							seed[i] = !(matches[i] = elem);
2204
						}
2205
					}
2206
				}) :
2207
				function( elem, context, xml ) {
2208
					input[0] = elem;
2209
					matcher( input, null, xml, results );
2210
					return !results.pop();
2211
				};
2212
		}),
2213
2214
		"has": markFunction(function( selector ) {
2215
			return function( elem ) {
2216
				return Sizzle( selector, elem ).length > 0;
2217
			};
2218
		}),
2219
2220
		"contains": markFunction(function( text ) {
2221
			return function( elem ) {
2222
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2223
			};
2224
		}),
2225
2226
		// "Whether an element is represented by a :lang() selector
2227
		// is based solely on the element's language value
2228
		// being equal to the identifier C,
2229
		// or beginning with the identifier C immediately followed by "-".
2230
		// The matching of C against the element's language value is performed case-insensitively.
2231
		// The identifier C does not have to be a valid language name."
2232
		// http://www.w3.org/TR/selectors/#lang-pseudo
2233
		"lang": markFunction( function( lang ) {
2234
			// lang value must be a valid identifier
2235
			if ( !ridentifier.test(lang || "") ) {
2236
				Sizzle.error( "unsupported lang: " + lang );
2237
			}
2238
			lang = lang.replace( runescape, funescape ).toLowerCase();
2239
			return function( elem ) {
2240
				var elemLang;
2241
				do {
2242
					if ( (elemLang = documentIsHTML ?
2243
						elem.lang :
2244
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2245
2246
						elemLang = elemLang.toLowerCase();
2247
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2248
					}
2249
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2250
				return false;
2251
			};
2252
		}),
2253
2254
		// Miscellaneous
2255
		"target": function( elem ) {
2256
			var hash = window.location && window.location.hash;
2257
			return hash && hash.slice( 1 ) === elem.id;
2258
		},
2259
2260
		"root": function( elem ) {
2261
			return elem === docElem;
2262
		},
2263
2264
		"focus": function( elem ) {
2265
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2266
		},
2267
2268
		// Boolean properties
2269
		"enabled": function( elem ) {
2270
			return elem.disabled === false;
2271
		},
2272
2273
		"disabled": function( elem ) {
2274
			return elem.disabled === true;
2275
		},
2276
2277
		"checked": function( elem ) {
2278
			// In CSS3, :checked should return both checked and selected elements
2279
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2280
			var nodeName = elem.nodeName.toLowerCase();
2281
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2282
		},
2283
2284
		"selected": function( elem ) {
2285
			// Accessing this property makes selected-by-default
2286
			// options in Safari work properly
2287
			if ( elem.parentNode ) {
2288
				elem.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to elem.parentNode.selectedIndex is not used.
Loading history...
2289
			}
2290
2291
			return elem.selected === true;
2292
		},
2293
2294
		// Contents
2295
		"empty": function( elem ) {
2296
			// http://www.w3.org/TR/selectors/#empty-pseudo
2297
			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
2298
			//   not comment, processing instructions, or others
2299
			// Thanks to Diego Perini for the nodeName shortcut
2300
			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
2301
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2302
				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
2303
					return false;
2304
				}
2305
			}
2306
			return true;
2307
		},
2308
2309
		"parent": function( elem ) {
2310
			return !Expr.pseudos["empty"]( elem );
2311
		},
2312
2313
		// Element/input types
2314
		"header": function( elem ) {
2315
			return rheader.test( elem.nodeName );
2316
		},
2317
2318
		"input": function( elem ) {
2319
			return rinputs.test( elem.nodeName );
2320
		},
2321
2322
		"button": function( elem ) {
2323
			var name = elem.nodeName.toLowerCase();
2324
			return name === "input" && elem.type === "button" || name === "button";
2325
		},
2326
2327
		"text": function( elem ) {
2328
			var attr;
2329
			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
2330
			// use getAttribute instead to test this case
2331
			return elem.nodeName.toLowerCase() === "input" &&
2332
				elem.type === "text" &&
2333
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
2334
		},
2335
2336
		// Position-in-collection
2337
		"first": createPositionalPseudo(function() {
2338
			return [ 0 ];
2339
		}),
2340
2341
		"last": createPositionalPseudo(function( matchIndexes, length ) {
2342
			return [ length - 1 ];
2343
		}),
2344
2345
		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2346
			return [ argument < 0 ? argument + length : argument ];
2347
		}),
2348
2349
		"even": createPositionalPseudo(function( matchIndexes, length ) {
2350
			var i = 0;
2351
			for ( ; i < length; i += 2 ) {
2352
				matchIndexes.push( i );
2353
			}
2354
			return matchIndexes;
2355
		}),
2356
2357
		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2358
			var i = 1;
2359
			for ( ; i < length; i += 2 ) {
2360
				matchIndexes.push( i );
2361
			}
2362
			return matchIndexes;
2363
		}),
2364
2365
		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2366
			var i = argument < 0 ? argument + length : argument;
2367
			for ( ; --i >= 0; ) {
2368
				matchIndexes.push( i );
2369
			}
2370
			return matchIndexes;
2371
		}),
2372
2373
		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2374
			var i = argument < 0 ? argument + length : argument;
2375
			for ( ; ++i < length; ) {
2376
				matchIndexes.push( i );
2377
			}
2378
			return matchIndexes;
2379
		})
2380
	}
2381
};
2382
2383
Expr.pseudos["nth"] = Expr.pseudos["eq"];
2384
2385
// Add button/input type pseudos
2386
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2387
	Expr.pseudos[ i ] = createInputPseudo( i );
2388
}
2389
for ( i in { submit: true, reset: true } ) {
2390
	Expr.pseudos[ i ] = createButtonPseudo( i );
2391
}
2392
2393
// Easy API for creating new setFilters
2394
function setFilters() {}
2395
setFilters.prototype = Expr.filters = Expr.pseudos;
2396
Expr.setFilters = new setFilters();
0 ignored issues
show
Coding Style Best Practice introduced by
By convention, constructors like setFilters should be capitalized.
Loading history...
2397
2398
function tokenize( selector, parseOnly ) {
2399
	var matched, match, tokens, type,
2400
		soFar, groups, preFilters,
2401
		cached = tokenCache[ selector + " " ];
2402
2403
	if ( cached ) {
2404
		return parseOnly ? 0 : cached.slice( 0 );
2405
	}
2406
2407
	soFar = selector;
2408
	groups = [];
2409
	preFilters = Expr.preFilter;
2410
2411
	while ( soFar ) {
2412
2413
		// Comma and first run
2414
		if ( !matched || (match = rcomma.exec( soFar )) ) {
2415
			if ( match ) {
2416
				// Don't consume trailing commas as valid
2417
				soFar = soFar.slice( match[0].length ) || soFar;
2418
			}
2419
			groups.push( tokens = [] );
2420
		}
2421
2422
		matched = false;
2423
2424
		// Combinators
2425
		if ( (match = rcombinators.exec( soFar )) ) {
2426
			matched = match.shift();
2427
			tokens.push({
0 ignored issues
show
Bug introduced by
The variable tokens seems to not be initialized for all possible execution paths.
Loading history...
2428
				value: matched,
2429
				// Cast descendant combinators to space
2430
				type: match[0].replace( rtrim, " " )
2431
			});
2432
			soFar = soFar.slice( matched.length );
2433
		}
2434
2435
		// Filters
2436
		for ( type in Expr.filter ) {
2437
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2438
				(match = preFilters[ type ]( match ))) ) {
2439
				matched = match.shift();
2440
				tokens.push({
2441
					value: matched,
2442
					type: type,
2443
					matches: match
2444
				});
2445
				soFar = soFar.slice( matched.length );
2446
			}
2447
		}
2448
2449
		if ( !matched ) {
2450
			break;
2451
		}
2452
	}
2453
2454
	// Return the length of the invalid excess
2455
	// if we're just parsing
2456
	// Otherwise, throw an error or return tokens
2457
	return parseOnly ?
2458
		soFar.length :
2459
		soFar ?
2460
			Sizzle.error( selector ) :
2461
			// Cache the tokens
2462
			tokenCache( selector, groups ).slice( 0 );
2463
}
2464
2465
function toSelector( tokens ) {
2466
	var i = 0,
2467
		len = tokens.length,
2468
		selector = "";
2469
	for ( ; i < len; i++ ) {
2470
		selector += tokens[i].value;
2471
	}
2472
	return selector;
2473
}
2474
2475
function addCombinator( matcher, combinator, base ) {
2476
	var dir = combinator.dir,
2477
		checkNonElements = base && dir === "parentNode",
2478
		doneName = done++;
2479
2480
	return combinator.first ?
2481
		// Check against closest ancestor/preceding element
2482
		function( elem, context, xml ) {
2483
			while ( (elem = elem[ dir ]) ) {
2484
				if ( elem.nodeType === 1 || checkNonElements ) {
2485
					return matcher( elem, context, xml );
2486
				}
2487
			}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2488
		} :
2489
2490
		// Check against all ancestor/preceding elements
2491
		function( elem, context, xml ) {
2492
			var data, cache, outerCache,
2493
				dirkey = dirruns + " " + doneName;
2494
2495
			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2496
			if ( xml ) {
2497
				while ( (elem = elem[ dir ]) ) {
2498
					if ( elem.nodeType === 1 || checkNonElements ) {
2499
						if ( matcher( elem, context, xml ) ) {
2500
							return true;
2501
						}
2502
					}
2503
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2504
			} else {
2505
				while ( (elem = elem[ dir ]) ) {
2506
					if ( elem.nodeType === 1 || checkNonElements ) {
2507
						outerCache = elem[ expando ] || (elem[ expando ] = {});
2508
						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
2509
							if ( (data = cache[1]) === true || data === cachedruns ) {
0 ignored issues
show
Bug introduced by
The variable cachedruns seems to not be initialized for all possible execution paths.
Loading history...
2510
								return data === true;
2511
							}
2512
						} else {
2513
							cache = outerCache[ dir ] = [ dirkey ];
2514
							cache[1] = matcher( elem, context, xml ) || cachedruns;
2515
							if ( cache[1] === true ) {
2516
								return true;
2517
							}
2518
						}
2519
					}
2520
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2521
			}
2522
		};
2523
}
2524
2525
function elementMatcher( matchers ) {
2526
	return matchers.length > 1 ?
2527
		function( elem, context, xml ) {
2528
			var i = matchers.length;
2529
			while ( i-- ) {
2530
				if ( !matchers[i]( elem, context, xml ) ) {
2531
					return false;
2532
				}
2533
			}
2534
			return true;
2535
		} :
2536
		matchers[0];
2537
}
2538
2539
function condense( unmatched, map, filter, context, xml ) {
2540
	var elem,
2541
		newUnmatched = [],
2542
		i = 0,
2543
		len = unmatched.length,
2544
		mapped = map != null;
2545
2546
	for ( ; i < len; i++ ) {
2547
		if ( (elem = unmatched[i]) ) {
2548
			if ( !filter || filter( elem, context, xml ) ) {
2549
				newUnmatched.push( elem );
2550
				if ( mapped ) {
2551
					map.push( i );
2552
				}
2553
			}
2554
		}
2555
	}
2556
2557
	return newUnmatched;
2558
}
2559
2560
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2561
	if ( postFilter && !postFilter[ expando ] ) {
2562
		postFilter = setMatcher( postFilter );
2563
	}
2564
	if ( postFinder && !postFinder[ expando ] ) {
2565
		postFinder = setMatcher( postFinder, postSelector );
2566
	}
2567
	return markFunction(function( seed, results, context, xml ) {
2568
		var temp, i, elem,
2569
			preMap = [],
2570
			postMap = [],
2571
			preexisting = results.length,
2572
2573
			// Get initial elements from seed or context
2574
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2575
2576
			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2577
			matcherIn = preFilter && ( seed || !selector ) ?
2578
				condense( elems, preMap, preFilter, context, xml ) :
2579
				elems,
2580
2581
			matcherOut = matcher ?
2582
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2583
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2584
2585
					// ...intermediate processing is necessary
2586
					[] :
2587
2588
					// ...otherwise use results directly
2589
					results :
2590
				matcherIn;
2591
2592
		// Find primary matches
2593
		if ( matcher ) {
2594
			matcher( matcherIn, matcherOut, context, xml );
2595
		}
2596
2597
		// Apply postFilter
2598
		if ( postFilter ) {
2599
			temp = condense( matcherOut, postMap );
2600
			postFilter( temp, [], context, xml );
2601
2602
			// Un-match failing elements by moving them back to matcherIn
2603
			i = temp.length;
2604
			while ( i-- ) {
2605
				if ( (elem = temp[i]) ) {
2606
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2607
				}
2608
			}
2609
		}
2610
2611
		if ( seed ) {
2612
			if ( postFinder || preFilter ) {
2613
				if ( postFinder ) {
2614
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2615
					temp = [];
2616
					i = matcherOut.length;
2617
					while ( i-- ) {
2618
						if ( (elem = matcherOut[i]) ) {
2619
							// Restore matcherIn since elem is not yet a final match
2620
							temp.push( (matcherIn[i] = elem) );
2621
						}
2622
					}
2623
					postFinder( null, (matcherOut = []), temp, xml );
2624
				}
2625
2626
				// Move matched elements from seed to results to keep them synchronized
2627
				i = matcherOut.length;
2628
				while ( i-- ) {
2629
					if ( (elem = matcherOut[i]) &&
2630
						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
2631
2632
						seed[temp] = !(results[temp] = elem);
2633
					}
2634
				}
2635
			}
2636
2637
		// Add elements to results, through postFinder if defined
2638
		} else {
2639
			matcherOut = condense(
2640
				matcherOut === results ?
2641
					matcherOut.splice( preexisting, matcherOut.length ) :
2642
					matcherOut
2643
			);
2644
			if ( postFinder ) {
2645
				postFinder( null, results, matcherOut, xml );
2646
			} else {
2647
				push.apply( results, matcherOut );
2648
			}
2649
		}
2650
	});
2651
}
2652
2653
function matcherFromTokens( tokens ) {
2654
	var checkContext, matcher, j,
2655
		len = tokens.length,
2656
		leadingRelative = Expr.relative[ tokens[0].type ],
2657
		implicitRelative = leadingRelative || Expr.relative[" "],
2658
		i = leadingRelative ? 1 : 0,
2659
2660
		// The foundational matcher ensures that elements are reachable from top-level context(s)
2661
		matchContext = addCombinator( function( elem ) {
2662
			return elem === checkContext;
2663
		}, implicitRelative, true ),
2664
		matchAnyContext = addCombinator( function( elem ) {
2665
			return indexOf.call( checkContext, elem ) > -1;
2666
		}, implicitRelative, true ),
2667
		matchers = [ function( elem, context, xml ) {
2668
			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2669
				(checkContext = context).nodeType ?
2670
					matchContext( elem, context, xml ) :
2671
					matchAnyContext( elem, context, xml ) );
2672
		} ];
2673
2674
	for ( ; i < len; i++ ) {
2675
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2676
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2677
		} else {
2678
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2679
2680
			// Return special upon seeing a positional matcher
2681
			if ( matcher[ expando ] ) {
2682
				// Find the next relative operator (if any) for proper handling
2683
				j = ++i;
2684
				for ( ; j < len; j++ ) {
2685
					if ( Expr.relative[ tokens[j].type ] ) {
2686
						break;
2687
					}
2688
				}
2689
				return setMatcher(
2690
					i > 1 && elementMatcher( matchers ),
2691
					i > 1 && toSelector(
2692
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2693
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2694
					).replace( rtrim, "$1" ),
2695
					matcher,
2696
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2697
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2698
					j < len && toSelector( tokens )
2699
				);
2700
			}
2701
			matchers.push( matcher );
2702
		}
2703
	}
2704
2705
	return elementMatcher( matchers );
2706
}
2707
2708
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2709
	// A counter to specify which element is currently being matched
2710
	var matcherCachedRuns = 0,
2711
		bySet = setMatchers.length > 0,
2712
		byElement = elementMatchers.length > 0,
2713
		superMatcher = function( seed, context, xml, results, expandContext ) {
2714
			var elem, j, matcher,
2715
				setMatched = [],
2716
				matchedCount = 0,
2717
				i = "0",
2718
				unmatched = seed && [],
2719
				outermost = expandContext != null,
2720
				contextBackup = outermostContext,
2721
				// We must always have either seed elements or context
2722
				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
2723
				// Use integer dirruns iff this is the outermost matcher
2724
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
2725
2726
			if ( outermost ) {
2727
				outermostContext = context !== document && context;
2728
				cachedruns = matcherCachedRuns;
2729
			}
2730
2731
			// Add elements passing elementMatchers directly to results
2732
			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2733
			for ( ; (elem = elems[i]) != null; i++ ) {
2734
				if ( byElement && elem ) {
2735
					j = 0;
2736
					while ( (matcher = elementMatchers[j++]) ) {
2737
						if ( matcher( elem, context, xml ) ) {
2738
							results.push( elem );
2739
							break;
2740
						}
2741
					}
2742
					if ( outermost ) {
2743
						dirruns = dirrunsUnique;
2744
						cachedruns = ++matcherCachedRuns;
0 ignored issues
show
Bug introduced by
The variable matcherCachedRuns is changed as part of the for loop for example by ++matcherCachedRuns on line 2744. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
2745
					}
2746
				}
2747
2748
				// Track unmatched elements for set filters
2749
				if ( bySet ) {
2750
					// They will have gone through all possible matchers
2751
					if ( (elem = !matcher && elem) ) {
2752
						matchedCount--;
2753
					}
2754
2755
					// Lengthen the array for every element, matched or not
2756
					if ( seed ) {
2757
						unmatched.push( elem );
2758
					}
2759
				}
2760
			}
2761
2762
			// Apply set filters to unmatched elements
2763
			matchedCount += i;
2764
			if ( bySet && i !== matchedCount ) {
2765
				j = 0;
2766
				while ( (matcher = setMatchers[j++]) ) {
2767
					matcher( unmatched, setMatched, context, xml );
2768
				}
2769
2770
				if ( seed ) {
2771
					// Reintegrate element matches to eliminate the need for sorting
2772
					if ( matchedCount > 0 ) {
2773
						while ( i-- ) {
2774
							if ( !(unmatched[i] || setMatched[i]) ) {
2775
								setMatched[i] = pop.call( results );
2776
							}
2777
						}
2778
					}
2779
2780
					// Discard index placeholder values to get only actual matches
2781
					setMatched = condense( setMatched );
2782
				}
2783
2784
				// Add matches to results
2785
				push.apply( results, setMatched );
2786
2787
				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2788
				if ( outermost && !seed && setMatched.length > 0 &&
2789
					( matchedCount + setMatchers.length ) > 1 ) {
2790
2791
					Sizzle.uniqueSort( results );
2792
				}
2793
			}
2794
2795
			// Override manipulation of globals by nested matchers
2796
			if ( outermost ) {
2797
				dirruns = dirrunsUnique;
2798
				outermostContext = contextBackup;
2799
			}
2800
2801
			return unmatched;
2802
		};
2803
2804
	return bySet ?
2805
		markFunction( superMatcher ) :
2806
		superMatcher;
2807
}
2808
2809
compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
2810
	var i,
2811
		setMatchers = [],
2812
		elementMatchers = [],
2813
		cached = compilerCache[ selector + " " ];
2814
2815
	if ( !cached ) {
2816
		// Generate a function of recursive functions that can be used to check each element
2817
		if ( !group ) {
2818
			group = tokenize( selector );
2819
		}
2820
		i = group.length;
2821
		while ( i-- ) {
2822
			cached = matcherFromTokens( group[i] );
2823
			if ( cached[ expando ] ) {
2824
				setMatchers.push( cached );
2825
			} else {
2826
				elementMatchers.push( cached );
2827
			}
2828
		}
2829
2830
		// Cache the compiled function
2831
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2832
	}
2833
	return cached;
2834
};
2835
2836
function multipleContexts( selector, contexts, results ) {
2837
	var i = 0,
2838
		len = contexts.length;
2839
	for ( ; i < len; i++ ) {
2840
		Sizzle( selector, contexts[i], results );
2841
	}
2842
	return results;
2843
}
2844
2845
function select( selector, context, results, seed ) {
2846
	var i, tokens, token, type, find,
2847
		match = tokenize( selector );
2848
2849
	if ( !seed ) {
2850
		// Try to minimize operations if there is only one group
2851
		if ( match.length === 1 ) {
2852
2853
			// Take a shortcut and set the context if the root selector is an ID
2854
			tokens = match[0] = match[0].slice( 0 );
2855
			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2856
					support.getById && context.nodeType === 9 && documentIsHTML &&
2857
					Expr.relative[ tokens[1].type ] ) {
2858
2859
				context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2860
				if ( !context ) {
2861
					return results;
2862
				}
2863
				selector = selector.slice( tokens.shift().value.length );
2864
			}
2865
2866
			// Fetch a seed set for right-to-left matching
2867
			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2868
			while ( i-- ) {
2869
				token = tokens[i];
2870
2871
				// Abort if we hit a combinator
2872
				if ( Expr.relative[ (type = token.type) ] ) {
2873
					break;
2874
				}
2875
				if ( (find = Expr.find[ type ]) ) {
2876
					// Search, expanding context for leading sibling combinators
2877
					if ( (seed = find(
2878
						token.matches[0].replace( runescape, funescape ),
2879
						rsibling.test( tokens[0].type ) && context.parentNode || context
2880
					)) ) {
2881
2882
						// If seed is empty or no tokens remain, we can return early
2883
						tokens.splice( i, 1 );
2884
						selector = seed.length && toSelector( tokens );
2885
						if ( !selector ) {
2886
							push.apply( results, seed );
2887
							return results;
2888
						}
2889
2890
						break;
2891
					}
2892
				}
2893
			}
2894
		}
2895
	}
2896
2897
	// Compile and execute a filtering function
2898
	// Provide `match` to avoid retokenization if we modified the selector above
2899
	compile( selector, match )(
2900
		seed,
2901
		context,
2902
		!documentIsHTML,
0 ignored issues
show
Bug introduced by
The variable documentIsHTML seems to not be initialized for all possible execution paths.
Loading history...
2903
		results,
2904
		rsibling.test( selector )
2905
	);
2906
	return results;
2907
}
2908
2909
// One-time assignments
2910
2911
// Sort stability
2912
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2913
2914
// Support: Chrome<14
2915
// Always assume duplicates if they aren't passed to the comparison function
2916
support.detectDuplicates = hasDuplicate;
2917
2918
// Initialize against the default document
2919
setDocument();
2920
2921
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2922
// Detached nodes confoundingly follow *each other*
2923
support.sortDetached = assert(function( div1 ) {
2924
	// Should return 1, but returns 4 (following)
2925
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2926
});
2927
2928
// Support: IE<8
2929
// Prevent attribute/property "interpolation"
2930
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2931
if ( !assert(function( div ) {
2932
	div.innerHTML = "<a href='#'></a>";
2933
	return div.firstChild.getAttribute("href") === "#" ;
2934
}) ) {
2935
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2936
		if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2937
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2938
		}
2939
	});
2940
}
2941
2942
// Support: IE<9
2943
// Use defaultValue in place of getAttribute("value")
2944
if ( !support.attributes || !assert(function( div ) {
2945
	div.innerHTML = "<input/>";
2946
	div.firstChild.setAttribute( "value", "" );
2947
	return div.firstChild.getAttribute( "value" ) === "";
2948
}) ) {
2949
	addHandle( "value", function( elem, name, isXML ) {
2950
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML && elem.nodeName.toLowerCase() === "input" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2951
			return elem.defaultValue;
2952
		}
2953
	});
2954
}
2955
2956
// Support: IE<9
2957
// Use getAttributeNode to fetch booleans when getAttribute lies
2958
if ( !assert(function( div ) {
2959
	return div.getAttribute("disabled") == null;
2960
}) ) {
2961
	addHandle( booleans, function( elem, name, isXML ) {
2962
		var val;
2963
		if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2964
			return (val = elem.getAttributeNode( name )) && val.specified ?
2965
				val.value :
2966
				elem[ name ] === true ? name.toLowerCase() : null;
2967
		}
2968
	});
2969
}
2970
2971
jQuery.find = Sizzle;
2972
jQuery.expr = Sizzle.selectors;
2973
jQuery.expr[":"] = jQuery.expr.pseudos;
2974
jQuery.unique = Sizzle.uniqueSort;
2975
jQuery.text = Sizzle.getText;
2976
jQuery.isXMLDoc = Sizzle.isXML;
2977
jQuery.contains = Sizzle.contains;
2978
2979
2980
})( window );
2981
// String to Object options format cache
2982
var optionsCache = {};
2983
2984
// Convert String-formatted options into Object-formatted ones and store in cache
2985
function createOptions( options ) {
2986
	var object = optionsCache[ options ] = {};
2987
	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
2988
		object[ flag ] = true;
2989
	});
2990
	return object;
2991
}
2992
2993
/*
2994
 * Create a callback list using the following parameters:
2995
 *
2996
 *	options: an optional list of space-separated options that will change how
2997
 *			the callback list behaves or a more traditional option object
2998
 *
2999
 * By default a callback list will act like an event callback list and can be
3000
 * "fired" multiple times.
3001
 *
3002
 * Possible options:
3003
 *
3004
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3005
 *
3006
 *	memory:			will keep track of previous values and will call any callback added
3007
 *					after the list has been fired right away with the latest "memorized"
3008
 *					values (like a Deferred)
3009
 *
3010
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3011
 *
3012
 *	stopOnFalse:	interrupt callings when a callback returns false
3013
 *
3014
 */
3015
jQuery.Callbacks = function( options ) {
3016
3017
	// Convert options from String-formatted to Object-formatted if needed
3018
	// (we check in cache first)
3019
	options = typeof options === "string" ?
3020
		( optionsCache[ options ] || createOptions( options ) ) :
3021
		jQuery.extend( {}, options );
3022
3023
	var // Flag to know if list is currently firing
3024
		firing,
3025
		// Last fire value (for non-forgettable lists)
3026
		memory,
3027
		// Flag to know if list was already fired
3028
		fired,
3029
		// End of the loop when firing
3030
		firingLength,
3031
		// Index of currently firing callback (modified by remove if needed)
3032
		firingIndex,
3033
		// First callback to fire (used internally by add and fireWith)
3034
		firingStart,
3035
		// Actual callback list
3036
		list = [],
3037
		// Stack of fire calls for repeatable lists
3038
		stack = !options.once && [],
3039
		// Fire callbacks
3040
		fire = function( data ) {
3041
			memory = options.memory && data;
3042
			fired = true;
3043
			firingIndex = firingStart || 0;
3044
			firingStart = 0;
3045
			firingLength = list.length;
3046
			firing = true;
3047
			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
0 ignored issues
show
Bug introduced by
The variable firingIndex is changed as part of the for loop for example by firingIndex++ on line 3047. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
3048
				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3049
					memory = false; // To prevent further calls using add
3050
					break;
3051
				}
3052
			}
3053
			firing = false;
3054
			if ( list ) {
3055
				if ( stack ) {
3056
					if ( stack.length ) {
3057
						fire( stack.shift() );
3058
					}
3059
				} else if ( memory ) {
3060
					list = [];
3061
				} else {
3062
					self.disable();
3063
				}
3064
			}
3065
		},
3066
		// Actual Callbacks object
3067
		self = {
3068
			// Add a callback or a collection of callbacks to the list
3069
			add: function() {
3070
				if ( list ) {
3071
					// First, we save the current length
3072
					var start = list.length;
3073
					(function add( args ) {
3074
						jQuery.each( args, function( _, arg ) {
3075
							var type = jQuery.type( arg );
3076
							if ( type === "function" ) {
3077
								if ( !options.unique || !self.has( arg ) ) {
3078
									list.push( arg );
3079
								}
3080
							} else if ( arg && arg.length && type !== "string" ) {
3081
								// Inspect recursively
3082
								add( arg );
3083
							}
3084
						});
3085
					})( arguments );
3086
					// Do we need to add the callbacks to the
3087
					// current firing batch?
3088
					if ( firing ) {
3089
						firingLength = list.length;
3090
					// With memory, if we're not firing then
3091
					// we should call right away
3092
					} else if ( memory ) {
3093
						firingStart = start;
3094
						fire( memory );
3095
					}
3096
				}
3097
				return this;
3098
			},
3099
			// Remove a callback from the list
3100
			remove: function() {
3101
				if ( list ) {
3102
					jQuery.each( arguments, function( _, arg ) {
3103
						var index;
3104
						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
0 ignored issues
show
introduced by
The variable index does not seem to be initialized in case the while loop on line 3104 is not entered. Are you sure the function inArray handles undefined variables?
Loading history...
3105
							list.splice( index, 1 );
3106
							// Handle firing indexes
3107
							if ( firing ) {
3108
								if ( index <= firingLength ) {
0 ignored issues
show
Bug introduced by
The variable firingLength seems to not be initialized for all possible execution paths.
Loading history...
3109
									firingLength--;
3110
								}
3111
								if ( index <= firingIndex ) {
0 ignored issues
show
Bug introduced by
The variable firingIndex seems to not be initialized for all possible execution paths.
Loading history...
3112
									firingIndex--;
3113
								}
3114
							}
3115
						}
3116
					});
3117
				}
3118
				return this;
3119
			},
3120
			// Check if a given callback is in the list.
3121
			// If no argument is given, return whether or not list has callbacks attached.
3122
			has: function( fn ) {
3123
				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3124
			},
3125
			// Remove all callbacks from the list
3126
			empty: function() {
3127
				list = [];
3128
				firingLength = 0;
3129
				return this;
3130
			},
3131
			// Have the list do nothing anymore
3132
			disable: function() {
3133
				list = stack = memory = undefined;
3134
				return this;
3135
			},
3136
			// Is it disabled?
3137
			disabled: function() {
3138
				return !list;
3139
			},
3140
			// Lock the list in its current state
3141
			lock: function() {
3142
				stack = undefined;
3143
				if ( !memory ) {
3144
					self.disable();
3145
				}
3146
				return this;
3147
			},
3148
			// Is it locked?
3149
			locked: function() {
3150
				return !stack;
3151
			},
3152
			// Call all callbacks with the given context and arguments
3153
			fireWith: function( context, args ) {
3154
				if ( list && ( !fired || stack ) ) {
3155
					args = args || [];
3156
					args = [ context, args.slice ? args.slice() : args ];
3157
					if ( firing ) {
3158
						stack.push( args );
3159
					} else {
3160
						fire( args );
3161
					}
3162
				}
3163
				return this;
3164
			},
3165
			// Call all the callbacks with the given arguments
3166
			fire: function() {
3167
				self.fireWith( this, arguments );
3168
				return this;
3169
			},
3170
			// To know if the callbacks have already been called at least once
3171
			fired: function() {
3172
				return !!fired;
3173
			}
3174
		};
3175
3176
	return self;
3177
};
3178
jQuery.extend({
3179
3180
	Deferred: function( func ) {
3181
		var tuples = [
3182
				// action, add listener, listener list, final state
3183
				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3184
				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3185
				[ "notify", "progress", jQuery.Callbacks("memory") ]
3186
			],
3187
			state = "pending",
3188
			promise = {
3189
				state: function() {
3190
					return state;
3191
				},
3192
				always: function() {
3193
					deferred.done( arguments ).fail( arguments );
3194
					return this;
3195
				},
3196
				then: function( /* fnDone, fnFail, fnProgress */ ) {
3197
					var fns = arguments;
3198
					return jQuery.Deferred(function( newDefer ) {
3199
						jQuery.each( tuples, function( i, tuple ) {
3200
							var action = tuple[ 0 ],
3201
								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3202
							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3203
							deferred[ tuple[1] ](function() {
3204
								var returned = fn && fn.apply( this, arguments );
3205
								if ( returned && jQuery.isFunction( returned.promise ) ) {
3206
									returned.promise()
3207
										.done( newDefer.resolve )
3208
										.fail( newDefer.reject )
3209
										.progress( newDefer.notify );
3210
								} else {
3211
									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3212
								}
3213
							});
3214
						});
3215
						fns = null;
3216
					}).promise();
3217
				},
3218
				// Get a promise for this deferred
3219
				// If obj is provided, the promise aspect is added to the object
3220
				promise: function( obj ) {
3221
					return obj != null ? jQuery.extend( obj, promise ) : promise;
3222
				}
3223
			},
3224
			deferred = {};
3225
3226
		// Keep pipe for back-compat
3227
		promise.pipe = promise.then;
3228
3229
		// Add list-specific methods
3230
		jQuery.each( tuples, function( i, tuple ) {
3231
			var list = tuple[ 2 ],
3232
				stateString = tuple[ 3 ];
3233
3234
			// promise[ done | fail | progress ] = list.add
3235
			promise[ tuple[1] ] = list.add;
3236
3237
			// Handle state
3238
			if ( stateString ) {
3239
				list.add(function() {
3240
					// state = [ resolved | rejected ]
3241
					state = stateString;
3242
3243
				// [ reject_list | resolve_list ].disable; progress_list.lock
3244
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3245
			}
3246
3247
			// deferred[ resolve | reject | notify ]
3248
			deferred[ tuple[0] ] = function() {
3249
				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3250
				return this;
3251
			};
3252
			deferred[ tuple[0] + "With" ] = list.fireWith;
3253
		});
3254
3255
		// Make the deferred a promise
3256
		promise.promise( deferred );
3257
3258
		// Call given func if any
3259
		if ( func ) {
3260
			func.call( deferred, deferred );
3261
		}
3262
3263
		// All done!
3264
		return deferred;
3265
	},
3266
3267
	// Deferred helper
3268
	when: function( subordinate /* , ..., subordinateN */ ) {
3269
		var i = 0,
3270
			resolveValues = core_slice.call( arguments ),
3271
			length = resolveValues.length,
3272
3273
			// the count of uncompleted subordinates
3274
			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3275
3276
			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3277
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3278
3279
			// Update function for both resolve and progress values
3280
			updateFunc = function( i, contexts, values ) {
3281
				return function( value ) {
3282
					contexts[ i ] = this;
3283
					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
3284
					if( values === progressValues ) {
3285
						deferred.notifyWith( contexts, values );
3286
					} else if ( !( --remaining ) ) {
3287
						deferred.resolveWith( contexts, values );
3288
					}
3289
				};
3290
			},
3291
3292
			progressValues, progressContexts, resolveContexts;
3293
3294
		// add listeners to Deferred subordinates; treat others as resolved
3295
		if ( length > 1 ) {
3296
			progressValues = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3297
			progressContexts = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3298
			resolveContexts = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3299
			for ( ; i < length; i++ ) {
3300
				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3301
					resolveValues[ i ].promise()
3302
						.done( updateFunc( i, resolveContexts, resolveValues ) )
3303
						.fail( deferred.reject )
3304
						.progress( updateFunc( i, progressContexts, progressValues ) );
3305
				} else {
3306
					--remaining;
3307
				}
3308
			}
3309
		}
3310
3311
		// if we're not waiting on anything, resolve the master
3312
		if ( !remaining ) {
3313
			deferred.resolveWith( resolveContexts, resolveValues );
0 ignored issues
show
Bug introduced by
The variable resolveContexts does not seem to be initialized in case length > 1 on line 3295 is false. Are you sure the function resolveWith handles undefined variables?
Loading history...
3314
		}
3315
3316
		return deferred.promise();
3317
	}
3318
});
3319
jQuery.support = (function( support ) {
3320
3321
	var all, a, input, select, fragment, opt, eventName, isSupported, i,
3322
		div = document.createElement("div");
3323
3324
	// Setup
3325
	div.setAttribute( "className", "t" );
3326
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
3327
3328
	// Finish early in limited (non-browser) environments
3329
	all = div.getElementsByTagName("*") || [];
3330
	a = div.getElementsByTagName("a")[ 0 ];
3331
	if ( !a || !a.style || !all.length ) {
3332
		return support;
3333
	}
3334
3335
	// First batch of tests
3336
	select = document.createElement("select");
3337
	opt = select.appendChild( document.createElement("option") );
3338
	input = div.getElementsByTagName("input")[ 0 ];
3339
3340
	a.style.cssText = "top:1px;float:left;opacity:.5";
3341
3342
	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
3343
	support.getSetAttribute = div.className !== "t";
3344
3345
	// IE strips leading whitespace when .innerHTML is used
3346
	support.leadingWhitespace = div.firstChild.nodeType === 3;
3347
3348
	// Make sure that tbody elements aren't automatically inserted
3349
	// IE will insert them into empty tables
3350
	support.tbody = !div.getElementsByTagName("tbody").length;
3351
3352
	// Make sure that link elements get serialized correctly by innerHTML
3353
	// This requires a wrapper element in IE
3354
	support.htmlSerialize = !!div.getElementsByTagName("link").length;
3355
3356
	// Get the style information from getAttribute
3357
	// (IE uses .cssText instead)
3358
	support.style = /top/.test( a.getAttribute("style") );
3359
3360
	// Make sure that URLs aren't manipulated
3361
	// (IE normalizes it by default)
3362
	support.hrefNormalized = a.getAttribute("href") === "/a";
3363
3364
	// Make sure that element opacity exists
3365
	// (IE uses filter instead)
3366
	// Use a regex to work around a WebKit issue. See #5145
3367
	support.opacity = /^0.5/.test( a.style.opacity );
3368
3369
	// Verify style float existence
3370
	// (IE uses styleFloat instead of cssFloat)
3371
	support.cssFloat = !!a.style.cssFloat;
3372
3373
	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
3374
	support.checkOn = !!input.value;
3375
3376
	// Make sure that a selected-by-default option has a working selected property.
3377
	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
3378
	support.optSelected = opt.selected;
3379
3380
	// Tests for enctype support on a form (#6743)
3381
	support.enctype = !!document.createElement("form").enctype;
3382
3383
	// Makes sure cloning an html5 element does not cause problems
3384
	// Where outerHTML is undefined, this still works
3385
	support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
3386
3387
	// Will be defined later
3388
	support.inlineBlockNeedsLayout = false;
3389
	support.shrinkWrapBlocks = false;
3390
	support.pixelPosition = false;
3391
	support.deleteExpando = true;
3392
	support.noCloneEvent = true;
3393
	support.reliableMarginRight = true;
3394
	support.boxSizingReliable = true;
3395
3396
	// Make sure checked status is properly cloned
3397
	input.checked = true;
3398
	support.noCloneChecked = input.cloneNode( true ).checked;
3399
3400
	// Make sure that the options inside disabled selects aren't marked as disabled
3401
	// (WebKit marks them as disabled)
3402
	select.disabled = true;
3403
	support.optDisabled = !opt.disabled;
3404
3405
	// Support: IE<9
3406
	try {
3407
		delete div.test;
3408
	} catch( e ) {
3409
		support.deleteExpando = false;
3410
	}
3411
3412
	// Check if we can trust getAttribute("value")
3413
	input = document.createElement("input");
3414
	input.setAttribute( "value", "" );
3415
	support.input = input.getAttribute( "value" ) === "";
3416
3417
	// Check if an input maintains its value after becoming a radio
3418
	input.value = "t";
3419
	input.setAttribute( "type", "radio" );
3420
	support.radioValue = input.value === "t";
3421
3422
	// #11217 - WebKit loses check when the name is after the checked attribute
3423
	input.setAttribute( "checked", "t" );
3424
	input.setAttribute( "name", "t" );
3425
3426
	fragment = document.createDocumentFragment();
3427
	fragment.appendChild( input );
3428
3429
	// Check if a disconnected checkbox will retain its checked
3430
	// value of true after appended to the DOM (IE6/7)
3431
	support.appendChecked = input.checked;
3432
3433
	// WebKit doesn't clone checked state correctly in fragments
3434
	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
3435
3436
	// Support: IE<9
3437
	// Opera does not clone events (and typeof div.attachEvent === undefined).
3438
	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
3439
	if ( div.attachEvent ) {
3440
		div.attachEvent( "onclick", function() {
3441
			support.noCloneEvent = false;
3442
		});
3443
3444
		div.cloneNode( true ).click();
3445
	}
3446
3447
	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
3448
	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
3449
	for ( i in { submit: true, change: true, focusin: true }) {
3450
		div.setAttribute( eventName = "on" + i, "t" );
3451
3452
		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
3453
	}
3454
3455
	div.style.backgroundClip = "content-box";
3456
	div.cloneNode( true ).style.backgroundClip = "";
3457
	support.clearCloneStyle = div.style.backgroundClip === "content-box";
3458
3459
	// Support: IE<9
3460
	// Iteration over object's inherited properties before its own.
3461
	for ( i in jQuery( support ) ) {
3462
		break;
3463
	}
3464
	support.ownLast = i !== "0";
0 ignored issues
show
Bug introduced by
The variable i seems to not be initialized for all possible execution paths.
Loading history...
3465
3466
	// Run tests that need a body at doc ready
3467
	jQuery(function() {
3468
		var container, marginDiv, tds,
3469
			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
3470
			body = document.getElementsByTagName("body")[0];
3471
3472
		if ( !body ) {
3473
			// Return for frameset docs that don't have a body
3474
			return;
3475
		}
3476
3477
		container = document.createElement("div");
3478
		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
3479
3480
		body.appendChild( container ).appendChild( div );
3481
3482
		// Support: IE8
3483
		// Check if table cells still have offsetWidth/Height when they are set
3484
		// to display:none and there are still other visible table cells in a
3485
		// table row; if so, offsetWidth/Height are not reliable for use when
3486
		// determining if an element has been hidden directly using
3487
		// display:none (it is still safe to use offsets if a parent element is
3488
		// hidden; don safety goggles and see bug #4512 for more information).
3489
		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
3490
		tds = div.getElementsByTagName("td");
3491
		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
3492
		isSupported = ( tds[ 0 ].offsetHeight === 0 );
3493
3494
		tds[ 0 ].style.display = "";
3495
		tds[ 1 ].style.display = "none";
3496
3497
		// Support: IE8
3498
		// Check if empty table cells still have offsetWidth/Height
3499
		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
3500
3501
		// Check box-sizing and margin behavior.
3502
		div.innerHTML = "";
3503
		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
3504
3505
		// Workaround failing boxSizing test due to offsetWidth returning wrong value
3506
		// with some non-1 values of body zoom, ticket #13543
3507
		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
3508
			support.boxSizing = div.offsetWidth === 4;
3509
		});
3510
3511
		// Use window.getComputedStyle because jsdom on node.js will break without it.
3512
		if ( window.getComputedStyle ) {
3513
			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
3514
			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
3515
3516
			// Check if div with explicit width and no margin-right incorrectly
3517
			// gets computed margin-right based on width of container. (#3333)
3518
			// Fails in WebKit before Feb 2011 nightlies
3519
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
3520
			marginDiv = div.appendChild( document.createElement("div") );
3521
			marginDiv.style.cssText = div.style.cssText = divReset;
3522
			marginDiv.style.marginRight = marginDiv.style.width = "0";
3523
			div.style.width = "1px";
3524
3525
			support.reliableMarginRight =
3526
				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
3527
		}
3528
3529
		if ( typeof div.style.zoom !== core_strundefined ) {
3530
			// Support: IE<8
3531
			// Check if natively block-level elements act like inline-block
3532
			// elements when setting their display to 'inline' and giving
3533
			// them layout
3534
			div.innerHTML = "";
3535
			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
3536
			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
3537
3538
			// Support: IE6
3539
			// Check if elements with layout shrink-wrap their children
3540
			div.style.display = "block";
3541
			div.innerHTML = "<div></div>";
3542
			div.firstChild.style.width = "5px";
3543
			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
3544
3545
			if ( support.inlineBlockNeedsLayout ) {
3546
				// Prevent IE 6 from affecting layout for positioned elements #11048
3547
				// Prevent IE from shrinking the body in IE 7 mode #12869
3548
				// Support: IE<8
3549
				body.style.zoom = 1;
3550
			}
3551
		}
3552
3553
		body.removeChild( container );
3554
3555
		// Null elements to avoid leaks in IE
3556
		container = div = tds = marginDiv = null;
0 ignored issues
show
Unused Code introduced by
The assignment to variable container seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to marginDiv seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable tds seems to be never used. Consider removing it.
Loading history...
3557
	});
3558
3559
	// Null elements to avoid leaks in IE
3560
	all = select = fragment = opt = a = input = null;
0 ignored issues
show
Unused Code introduced by
The assignment to variable a seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to input seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable select seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable fragment seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable all seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable opt seems to be never used. Consider removing it.
Loading history...
3561
3562
	return support;
3563
})({});
3564
3565
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
3566
	rmultiDash = /([A-Z])/g;
3567
3568
function internalData( elem, name, data, pvt /* Internal Use Only */ ){
3569
	if ( !jQuery.acceptData( elem ) ) {
3570
		return;
3571
	}
3572
3573
	var ret, thisCache,
3574
		internalKey = jQuery.expando,
3575
3576
		// We have to handle DOM nodes and JS objects differently because IE6-7
3577
		// can't GC object references properly across the DOM-JS boundary
3578
		isNode = elem.nodeType,
3579
3580
		// Only DOM nodes need the global jQuery cache; JS object data is
3581
		// attached directly to the object so GC can occur automatically
3582
		cache = isNode ? jQuery.cache : elem,
3583
3584
		// Only defining an ID for JS objects if its cache already exists allows
3585
		// the code to shortcut on the same path as a DOM node with no cache
3586
		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3587
3588
	// Avoid doing any more work than we need to when trying to get data on an
3589
	// object that has no data at all
3590
	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
3591
		return;
3592
	}
3593
3594
	if ( !id ) {
3595
		// Only DOM nodes need a new unique ID for each element since their data
3596
		// ends up in the global cache
3597
		if ( isNode ) {
3598
			id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
3599
		} else {
3600
			id = internalKey;
3601
		}
3602
	}
3603
3604
	if ( !cache[ id ] ) {
3605
		// Avoid exposing jQuery metadata on plain JS objects when the object
3606
		// is serialized using JSON.stringify
3607
		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3608
	}
3609
3610
	// An object can be passed to jQuery.data instead of a key/value pair; this gets
3611
	// shallow copied over onto the existing cache
3612
	if ( typeof name === "object" || typeof name === "function" ) {
3613
		if ( pvt ) {
3614
			cache[ id ] = jQuery.extend( cache[ id ], name );
3615
		} else {
3616
			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3617
		}
3618
	}
3619
3620
	thisCache = cache[ id ];
3621
3622
	// jQuery data() is stored in a separate object inside the object's internal data
3623
	// cache in order to avoid key collisions between internal data and user-defined
3624
	// data.
3625
	if ( !pvt ) {
3626
		if ( !thisCache.data ) {
3627
			thisCache.data = {};
3628
		}
3629
3630
		thisCache = thisCache.data;
3631
	}
3632
3633
	if ( data !== undefined ) {
3634
		thisCache[ jQuery.camelCase( name ) ] = data;
3635
	}
3636
3637
	// Check for both converted-to-camel and non-converted data property names
3638
	// If a data property was specified
3639
	if ( typeof name === "string" ) {
3640
3641
		// First Try to find as-is property data
3642
		ret = thisCache[ name ];
3643
3644
		// Test for null|undefined property data
3645
		if ( ret == null ) {
3646
3647
			// Try to find the camelCased property
3648
			ret = thisCache[ jQuery.camelCase( name ) ];
3649
		}
3650
	} else {
3651
		ret = thisCache;
3652
	}
3653
3654
	return ret;
3655
}
3656
3657
function internalRemoveData( elem, name, pvt ) {
3658
	if ( !jQuery.acceptData( elem ) ) {
3659
		return;
3660
	}
3661
3662
	var thisCache, i,
3663
		isNode = elem.nodeType,
3664
3665
		// See jQuery.data for more information
3666
		cache = isNode ? jQuery.cache : elem,
3667
		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3668
3669
	// If there is already no cache entry for this object, there is no
3670
	// purpose in continuing
3671
	if ( !cache[ id ] ) {
3672
		return;
3673
	}
3674
3675
	if ( name ) {
3676
3677
		thisCache = pvt ? cache[ id ] : cache[ id ].data;
3678
3679
		if ( thisCache ) {
3680
3681
			// Support array or space separated string names for data keys
3682
			if ( !jQuery.isArray( name ) ) {
3683
3684
				// try the string as a key before any manipulation
3685
				if ( name in thisCache ) {
3686
					name = [ name ];
3687
				} else {
3688
3689
					// split the camel cased version by spaces unless a key with the spaces exists
3690
					name = jQuery.camelCase( name );
3691
					if ( name in thisCache ) {
3692
						name = [ name ];
3693
					} else {
3694
						name = name.split(" ");
3695
					}
3696
				}
3697
			} else {
3698
				// If "name" is an array of keys...
3699
				// When data is initially created, via ("key", "val") signature,
3700
				// keys will be converted to camelCase.
3701
				// Since there is no way to tell _how_ a key was added, remove
3702
				// both plain key and camelCase key. #12786
3703
				// This will only penalize the array argument path.
3704
				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3705
			}
3706
3707
			i = name.length;
3708
			while ( i-- ) {
3709
				delete thisCache[ name[i] ];
3710
			}
3711
3712
			// If there is no data left in the cache, we want to continue
3713
			// and let the cache object itself get destroyed
3714
			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
3715
				return;
3716
			}
3717
		}
3718
	}
3719
3720
	// See jQuery.data for more information
3721
	if ( !pvt ) {
3722
		delete cache[ id ].data;
3723
3724
		// Don't destroy the parent cache unless the internal data object
3725
		// had been the only thing left in it
3726
		if ( !isEmptyDataObject( cache[ id ] ) ) {
3727
			return;
3728
		}
3729
	}
3730
3731
	// Destroy the cache
3732
	if ( isNode ) {
3733
		jQuery.cleanData( [ elem ], true );
3734
3735
	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3736
	/* jshint eqeqeq: false */
3737
	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
3738
		/* jshint eqeqeq: true */
3739
		delete cache[ id ];
3740
3741
	// When all else fails, null
3742
	} else {
3743
		cache[ id ] = null;
3744
	}
3745
}
3746
3747
jQuery.extend({
3748
	cache: {},
3749
3750
	// The following elements throw uncatchable exceptions if you
3751
	// attempt to add expando properties to them.
3752
	noData: {
3753
		"applet": true,
3754
		"embed": true,
3755
		// Ban all objects except for Flash (which handle expandos)
3756
		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3757
	},
3758
3759
	hasData: function( elem ) {
3760
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
3761
		return !!elem && !isEmptyDataObject( elem );
3762
	},
3763
3764
	data: function( elem, name, data ) {
3765
		return internalData( elem, name, data );
3766
	},
3767
3768
	removeData: function( elem, name ) {
3769
		return internalRemoveData( elem, name );
3770
	},
3771
3772
	// For internal use only.
3773
	_data: function( elem, name, data ) {
3774
		return internalData( elem, name, data, true );
3775
	},
3776
3777
	_removeData: function( elem, name ) {
3778
		return internalRemoveData( elem, name, true );
3779
	},
3780
3781
	// A method for determining if a DOM node can handle the data expando
3782
	acceptData: function( elem ) {
3783
		// Do not set data on non-element because it will not be cleared (#8335).
3784
		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
3785
			return false;
3786
		}
3787
3788
		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
3789
3790
		// nodes accept data unless otherwise specified; rejection can be conditional
3791
		return !noData || noData !== true && elem.getAttribute("classid") === noData;
3792
	}
3793
});
3794
3795
jQuery.fn.extend({
3796
	data: function( key, value ) {
3797
		var attrs, name,
3798
			data = null,
3799
			i = 0,
3800
			elem = this[0];
3801
3802
		// Special expections of .data basically thwart jQuery.access,
3803
		// so implement the relevant behavior ourselves
3804
3805
		// Gets all values
3806
		if ( key === undefined ) {
3807
			if ( this.length ) {
3808
				data = jQuery.data( elem );
3809
3810
				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
3811
					attrs = elem.attributes;
3812
					for ( ; i < attrs.length; i++ ) {
3813
						name = attrs[i].name;
3814
3815
						if ( name.indexOf("data-") === 0 ) {
3816
							name = jQuery.camelCase( name.slice(5) );
3817
3818
							dataAttr( elem, name, data[ name ] );
3819
						}
3820
					}
3821
					jQuery._data( elem, "parsedAttrs", true );
3822
				}
3823
			}
3824
3825
			return data;
3826
		}
3827
3828
		// Sets multiple values
3829
		if ( typeof key === "object" ) {
3830
			return this.each(function() {
3831
				jQuery.data( this, key );
3832
			});
3833
		}
3834
3835
		return arguments.length > 1 ?
3836
3837
			// Sets one value
3838
			this.each(function() {
3839
				jQuery.data( this, key, value );
3840
			}) :
3841
3842
			// Gets one value
3843
			// Try to fetch any internally stored data first
3844
			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
3845
	},
3846
3847
	removeData: function( key ) {
3848
		return this.each(function() {
3849
			jQuery.removeData( this, key );
3850
		});
3851
	}
3852
});
3853
3854
function dataAttr( elem, key, data ) {
3855
	// If nothing was found internally, try to fetch any
3856
	// data from the HTML5 data-* attribute
3857
	if ( data === undefined && elem.nodeType === 1 ) {
3858
3859
		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3860
3861
		data = elem.getAttribute( name );
3862
3863
		if ( typeof data === "string" ) {
3864
			try {
3865
				data = data === "true" ? true :
3866
					data === "false" ? false :
3867
					data === "null" ? null :
3868
					// Only convert to a number if it doesn't change the string
3869
					+data + "" === data ? +data :
3870
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
3871
						data;
3872
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
3873
3874
			// Make sure we set the data so it isn't changed later
3875
			jQuery.data( elem, key, data );
3876
3877
		} else {
3878
			data = undefined;
3879
		}
3880
	}
3881
3882
	return data;
3883
}
3884
3885
// checks a cache object for emptiness
3886
function isEmptyDataObject( obj ) {
3887
	var name;
3888
	for ( name in obj ) {
3889
3890
		// if the public data object is empty, the private is still empty
3891
		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3892
			continue;
3893
		}
3894
		if ( name !== "toJSON" ) {
3895
			return false;
3896
		}
3897
	}
3898
3899
	return true;
3900
}
3901
jQuery.extend({
3902
	queue: function( elem, type, data ) {
3903
		var queue;
3904
3905
		if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
3906
			type = ( type || "fx" ) + "queue";
3907
			queue = jQuery._data( elem, type );
3908
3909
			// Speed up dequeue by getting out quickly if this is just a lookup
3910
			if ( data ) {
3911
				if ( !queue || jQuery.isArray(data) ) {
3912
					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
3913
				} else {
3914
					queue.push( data );
3915
				}
3916
			}
3917
			return queue || [];
3918
		}
3919
	},
3920
3921
	dequeue: function( elem, type ) {
3922
		type = type || "fx";
3923
3924
		var queue = jQuery.queue( elem, type ),
3925
			startLength = queue.length,
3926
			fn = queue.shift(),
3927
			hooks = jQuery._queueHooks( elem, type ),
3928
			next = function() {
3929
				jQuery.dequeue( elem, type );
3930
			};
3931
3932
		// If the fx queue is dequeued, always remove the progress sentinel
3933
		if ( fn === "inprogress" ) {
3934
			fn = queue.shift();
3935
			startLength--;
3936
		}
3937
3938
		if ( fn ) {
3939
3940
			// Add a progress sentinel to prevent the fx queue from being
3941
			// automatically dequeued
3942
			if ( type === "fx" ) {
3943
				queue.unshift( "inprogress" );
3944
			}
3945
3946
			// clear up the last queue stop function
3947
			delete hooks.stop;
3948
			fn.call( elem, next, hooks );
3949
		}
3950
3951
		if ( !startLength && hooks ) {
3952
			hooks.empty.fire();
3953
		}
3954
	},
3955
3956
	// not intended for public consumption - generates a queueHooks object, or returns the current one
3957
	_queueHooks: function( elem, type ) {
3958
		var key = type + "queueHooks";
3959
		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
3960
			empty: jQuery.Callbacks("once memory").add(function() {
3961
				jQuery._removeData( elem, type + "queue" );
3962
				jQuery._removeData( elem, key );
3963
			})
3964
		});
3965
	}
3966
});
3967
3968
jQuery.fn.extend({
3969
	queue: function( type, data ) {
3970
		var setter = 2;
3971
3972
		if ( typeof type !== "string" ) {
3973
			data = type;
3974
			type = "fx";
3975
			setter--;
3976
		}
3977
3978
		if ( arguments.length < setter ) {
3979
			return jQuery.queue( this[0], type );
3980
		}
3981
3982
		return data === undefined ?
3983
			this :
3984
			this.each(function() {
3985
				var queue = jQuery.queue( this, type, data );
3986
3987
				// ensure a hooks for this queue
3988
				jQuery._queueHooks( this, type );
3989
3990
				if ( type === "fx" && queue[0] !== "inprogress" ) {
3991
					jQuery.dequeue( this, type );
3992
				}
3993
			});
3994
	},
3995
	dequeue: function( type ) {
3996
		return this.each(function() {
3997
			jQuery.dequeue( this, type );
3998
		});
3999
	},
4000
	// Based off of the plugin by Clint Helfers, with permission.
4001
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
4002
	delay: function( time, type ) {
4003
		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
4004
		type = type || "fx";
4005
4006
		return this.queue( type, function( next, hooks ) {
4007
			var timeout = setTimeout( next, time );
4008
			hooks.stop = function() {
4009
				clearTimeout( timeout );
4010
			};
4011
		});
4012
	},
4013
	clearQueue: function( type ) {
4014
		return this.queue( type || "fx", [] );
4015
	},
4016
	// Get a promise resolved when queues of a certain type
4017
	// are emptied (fx is the type by default)
4018
	promise: function( type, obj ) {
4019
		var tmp,
4020
			count = 1,
4021
			defer = jQuery.Deferred(),
4022
			elements = this,
4023
			i = this.length,
4024
			resolve = function() {
4025
				if ( !( --count ) ) {
4026
					defer.resolveWith( elements, [ elements ] );
4027
				}
4028
			};
4029
4030
		if ( typeof type !== "string" ) {
4031
			obj = type;
4032
			type = undefined;
4033
		}
4034
		type = type || "fx";
4035
4036
		while( i-- ) {
4037
			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
4038
			if ( tmp && tmp.empty ) {
4039
				count++;
4040
				tmp.empty.add( resolve );
4041
			}
4042
		}
4043
		resolve();
4044
		return defer.promise( obj );
4045
	}
4046
});
4047
var nodeHook, boolHook,
4048
	rclass = /[\t\r\n\f]/g,
4049
	rreturn = /\r/g,
4050
	rfocusable = /^(?:input|select|textarea|button|object)$/i,
4051
	rclickable = /^(?:a|area)$/i,
4052
	ruseDefault = /^(?:checked|selected)$/i,
4053
	getSetAttribute = jQuery.support.getSetAttribute,
4054
	getSetInput = jQuery.support.input;
4055
4056
jQuery.fn.extend({
4057
	attr: function( name, value ) {
4058
		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
4059
	},
4060
4061
	removeAttr: function( name ) {
4062
		return this.each(function() {
4063
			jQuery.removeAttr( this, name );
4064
		});
4065
	},
4066
4067
	prop: function( name, value ) {
4068
		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
4069
	},
4070
4071
	removeProp: function( name ) {
4072
		name = jQuery.propFix[ name ] || name;
4073
		return this.each(function() {
4074
			// try/catch handles cases where IE balks (such as removing a property on window)
4075
			try {
4076
				this[ name ] = undefined;
4077
				delete this[ name ];
4078
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
4079
		});
4080
	},
4081
4082 View Code Duplication
	addClass: function( value ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4083
		var classes, elem, cur, clazz, j,
4084
			i = 0,
4085
			len = this.length,
4086
			proceed = typeof value === "string" && value;
4087
4088
		if ( jQuery.isFunction( value ) ) {
4089
			return this.each(function( j ) {
4090
				jQuery( this ).addClass( value.call( this, j, this.className ) );
4091
			});
4092
		}
4093
4094
		if ( proceed ) {
4095
			// The disjunction here is for better compressibility (see removeClass)
4096
			classes = ( value || "" ).match( core_rnotwhite ) || [];
4097
4098
			for ( ; i < len; i++ ) {
4099
				elem = this[ i ];
4100
				cur = elem.nodeType === 1 && ( elem.className ?
4101
					( " " + elem.className + " " ).replace( rclass, " " ) :
4102
					" "
4103
				);
4104
4105
				if ( cur ) {
4106
					j = 0;
4107
					while ( (clazz = classes[j++]) ) {
4108
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
4109
							cur += clazz + " ";
4110
						}
4111
					}
4112
					elem.className = jQuery.trim( cur );
4113
4114
				}
4115
			}
4116
		}
4117
4118
		return this;
4119
	},
4120
4121 View Code Duplication
	removeClass: function( value ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4122
		var classes, elem, cur, clazz, j,
4123
			i = 0,
4124
			len = this.length,
4125
			proceed = arguments.length === 0 || typeof value === "string" && value;
4126
4127
		if ( jQuery.isFunction( value ) ) {
4128
			return this.each(function( j ) {
4129
				jQuery( this ).removeClass( value.call( this, j, this.className ) );
4130
			});
4131
		}
4132
		if ( proceed ) {
4133
			classes = ( value || "" ).match( core_rnotwhite ) || [];
4134
4135
			for ( ; i < len; i++ ) {
4136
				elem = this[ i ];
4137
				// This expression is here for better compressibility (see addClass)
4138
				cur = elem.nodeType === 1 && ( elem.className ?
4139
					( " " + elem.className + " " ).replace( rclass, " " ) :
4140
					""
4141
				);
4142
4143
				if ( cur ) {
4144
					j = 0;
4145
					while ( (clazz = classes[j++]) ) {
4146
						// Remove *all* instances
4147
						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
4148
							cur = cur.replace( " " + clazz + " ", " " );
4149
						}
4150
					}
4151
					elem.className = value ? jQuery.trim( cur ) : "";
4152
				}
4153
			}
4154
		}
4155
4156
		return this;
4157
	},
4158
4159
	toggleClass: function( value, stateVal ) {
4160
		var type = typeof value;
4161
4162
		if ( typeof stateVal === "boolean" && type === "string" ) {
4163
			return stateVal ? this.addClass( value ) : this.removeClass( value );
4164
		}
4165
4166
		if ( jQuery.isFunction( value ) ) {
4167
			return this.each(function( i ) {
4168
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
4169
			});
4170
		}
4171
4172
		return this.each(function() {
4173
			if ( type === "string" ) {
4174
				// toggle individual class names
4175
				var className,
4176
					i = 0,
4177
					self = jQuery( this ),
4178
					classNames = value.match( core_rnotwhite ) || [];
4179
4180
				while ( (className = classNames[ i++ ]) ) {
4181
					// check each className given, space separated list
4182
					if ( self.hasClass( className ) ) {
4183
						self.removeClass( className );
4184
					} else {
4185
						self.addClass( className );
4186
					}
4187
				}
4188
4189
			// Toggle whole class name
4190
			} else if ( type === core_strundefined || type === "boolean" ) {
4191
				if ( this.className ) {
4192
					// store className if set
4193
					jQuery._data( this, "__className__", this.className );
4194
				}
4195
4196
				// If the element has a class name or if we're passed "false",
4197
				// then remove the whole classname (if there was one, the above saved it).
4198
				// Otherwise bring back whatever was previously saved (if anything),
4199
				// falling back to the empty string if nothing was stored.
4200
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
4201
			}
4202
		});
4203
	},
4204
4205
	hasClass: function( selector ) {
4206
		var className = " " + selector + " ",
4207
			i = 0,
4208
			l = this.length;
4209
		for ( ; i < l; i++ ) {
4210
			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
4211
				return true;
4212
			}
4213
		}
4214
4215
		return false;
4216
	},
4217
4218
	val: function( value ) {
4219
		var ret, hooks, isFunction,
4220
			elem = this[0];
4221
4222
		if ( !arguments.length ) {
4223
			if ( elem ) {
4224
				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
4225
4226
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
4227
					return ret;
4228
				}
4229
4230
				ret = elem.value;
4231
4232
				return typeof ret === "string" ?
4233
					// handle most common string cases
4234
					ret.replace(rreturn, "") :
4235
					// handle cases where value is null/undef or number
4236
					ret == null ? "" : ret;
4237
			}
4238
4239
			return;
4240
		}
4241
4242
		isFunction = jQuery.isFunction( value );
4243
4244
		return this.each(function( i ) {
4245
			var val;
4246
4247
			if ( this.nodeType !== 1 ) {
4248
				return;
4249
			}
4250
4251
			if ( isFunction ) {
4252
				val = value.call( this, i, jQuery( this ).val() );
4253
			} else {
4254
				val = value;
4255
			}
4256
4257
			// Treat null/undefined as ""; convert numbers to string
4258
			if ( val == null ) {
4259
				val = "";
4260
			} else if ( typeof val === "number" ) {
4261
				val += "";
4262
			} else if ( jQuery.isArray( val ) ) {
4263
				val = jQuery.map(val, function ( value ) {
4264
					return value == null ? "" : value + "";
4265
				});
4266
			}
4267
4268
			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
4269
4270
			// If set returns undefined, fall back to normal setting
4271
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
4272
				this.value = val;
4273
			}
4274
		});
4275
	}
4276
});
4277
4278
jQuery.extend({
4279
	valHooks: {
4280
		option: {
4281
			get: function( elem ) {
4282
				// Use proper attribute retrieval(#6932, #12072)
4283
				var val = jQuery.find.attr( elem, "value" );
4284
				return val != null ?
4285
					val :
4286
					elem.text;
4287
			}
4288
		},
4289
		select: {
4290
			get: function( elem ) {
4291
				var value, option,
4292
					options = elem.options,
4293
					index = elem.selectedIndex,
4294
					one = elem.type === "select-one" || index < 0,
4295
					values = one ? null : [],
4296
					max = one ? index + 1 : options.length,
4297
					i = index < 0 ?
4298
						max :
4299
						one ? index : 0;
4300
4301
				// Loop through all the selected options
4302
				for ( ; i < max; i++ ) {
4303
					option = options[ i ];
4304
4305
					// oldIE doesn't update selected after form reset (#2551)
4306
					if ( ( option.selected || i === index ) &&
4307
							// Don't return options that are disabled or in a disabled optgroup
4308
							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
4309
							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
4310
4311
						// Get the specific value for the option
4312
						value = jQuery( option ).val();
4313
4314
						// We don't need an array for one selects
4315
						if ( one ) {
4316
							return value;
4317
						}
4318
4319
						// Multi-Selects return an array
4320
						values.push( value );
4321
					}
4322
				}
4323
4324
				return values;
4325
			},
4326
4327
			set: function( elem, value ) {
4328
				var optionSet, option,
4329
					options = elem.options,
4330
					values = jQuery.makeArray( value ),
4331
					i = options.length;
4332
4333
				while ( i-- ) {
4334
					option = options[ i ];
4335
					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
4336
						optionSet = true;
4337
					}
4338
				}
4339
4340
				// force browsers to behave consistently when non-matching value is set
4341
				if ( !optionSet ) {
4342
					elem.selectedIndex = -1;
4343
				}
4344
				return values;
4345
			}
4346
		}
4347
	},
4348
4349
	attr: function( elem, name, value ) {
4350
		var hooks, ret,
4351
			nType = elem.nodeType;
4352
4353
		// don't get/set attributes on text, comment and attribute nodes
4354
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
4355
			return;
4356
		}
4357
4358
		// Fallback to prop when attributes are not supported
4359
		if ( typeof elem.getAttribute === core_strundefined ) {
4360
			return jQuery.prop( elem, name, value );
4361
		}
4362
4363
		// All attributes are lowercase
4364
		// Grab necessary hook if one is defined
4365
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
4366
			name = name.toLowerCase();
4367
			hooks = jQuery.attrHooks[ name ] ||
4368
				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
4369
		}
4370
4371
		if ( value !== undefined ) {
4372
4373
			if ( value === null ) {
4374
				jQuery.removeAttr( elem, name );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4375
4376
			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
4377
				return ret;
4378
4379
			} else {
4380
				elem.setAttribute( name, value + "" );
4381
				return value;
4382
			}
4383
4384
		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
4385
			return ret;
4386
4387
		} else {
4388
			ret = jQuery.find.attr( elem, name );
4389
4390
			// Non-existent attributes return null, we normalize to undefined
4391
			return ret == null ?
4392
				undefined :
4393
				ret;
4394
		}
4395
	},
4396
4397
	removeAttr: function( elem, value ) {
4398
		var name, propName,
4399
			i = 0,
4400
			attrNames = value && value.match( core_rnotwhite );
4401
4402
		if ( attrNames && elem.nodeType === 1 ) {
4403
			while ( (name = attrNames[i++]) ) {
4404
				propName = jQuery.propFix[ name ] || name;
4405
4406
				// Boolean attributes get special treatment (#10870)
4407
				if ( jQuery.expr.match.bool.test( name ) ) {
4408
					// Set corresponding property to false
4409
					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
4410
						elem[ propName ] = false;
4411
					// Support: IE<9
4412
					// Also clear defaultChecked/defaultSelected (if appropriate)
4413
					} else {
4414
						elem[ jQuery.camelCase( "default-" + name ) ] =
4415
							elem[ propName ] = false;
4416
					}
4417
4418
				// See #9699 for explanation of this approach (setting first, then removal)
4419
				} else {
4420
					jQuery.attr( elem, name, "" );
4421
				}
4422
4423
				elem.removeAttribute( getSetAttribute ? name : propName );
4424
			}
4425
		}
4426
	},
4427
4428
	attrHooks: {
4429
		type: {
4430
			set: function( elem, value ) {
4431
				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !jQuery.support.radioVal...nodeName(elem, "input") is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4432
					// Setting the type on a radio button after the value resets the value in IE6-9
4433
					// Reset value to default in case type is set after value during creation
4434
					var val = elem.value;
4435
					elem.setAttribute( "type", value );
4436
					if ( val ) {
4437
						elem.value = val;
4438
					}
4439
					return value;
4440
				}
4441
			}
4442
		}
4443
	},
4444
4445
	propFix: {
4446
		"for": "htmlFor",
4447
		"class": "className"
4448
	},
4449
4450
	prop: function( elem, name, value ) {
4451
		var ret, hooks, notxml,
4452
			nType = elem.nodeType;
4453
4454
		// don't get/set properties on text, comment and attribute nodes
4455
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
4456
			return;
4457
		}
4458
4459
		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
4460
4461
		if ( notxml ) {
4462
			// Fix name and attach hooks
4463
			name = jQuery.propFix[ name ] || name;
4464
			hooks = jQuery.propHooks[ name ];
4465
		}
4466
4467
		if ( value !== undefined ) {
4468
			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
4469
				ret :
0 ignored issues
show
Bug introduced by
The variable ret seems to not be initialized for all possible execution paths.
Loading history...
4470
				( elem[ name ] = value );
4471
4472
		} else {
4473
			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
4474
				ret :
4475
				elem[ name ];
4476
		}
4477
	},
4478
4479
	propHooks: {
4480
		tabIndex: {
4481
			get: function( elem ) {
4482
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
4483
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
4484
				// Use proper attribute retrieval(#12072)
4485
				var tabindex = jQuery.find.attr( elem, "tabindex" );
4486
4487
				return tabindex ?
4488
					parseInt( tabindex, 10 ) :
4489
					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
4490
						0 :
4491
						-1;
4492
			}
4493
		}
4494
	}
4495
});
4496
4497
// Hooks for boolean attributes
4498
boolHook = {
4499
	set: function( elem, value, name ) {
4500
		if ( value === false ) {
4501
			// Remove boolean attributes when set to false
4502
			jQuery.removeAttr( elem, name );
4503
		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
4504
			// IE<8 needs the *property* name
4505
			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
4506
4507
		// Use defaultChecked and defaultSelected for oldIE
4508
		} else {
4509
			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
4510
		}
4511
4512
		return name;
4513
	}
4514
};
4515
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
4516
	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
4517
4518
	jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
4519
		function( elem, name, isXML ) {
4520
			var fn = jQuery.expr.attrHandle[ name ],
4521
				ret = isXML ?
4522
					undefined :
4523
					/* jshint eqeqeq: false */
4524
					(jQuery.expr.attrHandle[ name ] = undefined) !=
4525
						getter( elem, name, isXML ) ?
4526
4527
						name.toLowerCase() :
4528
						null;
4529
			jQuery.expr.attrHandle[ name ] = fn;
4530
			return ret;
4531
		} :
4532
		function( elem, name, isXML ) {
4533
			return isXML ?
4534
				undefined :
4535
				elem[ jQuery.camelCase( "default-" + name ) ] ?
4536
					name.toLowerCase() :
4537
					null;
4538
		};
4539
});
4540
4541
// fix oldIE attroperties
4542
if ( !getSetInput || !getSetAttribute ) {
4543
	jQuery.attrHooks.value = {
4544
		set: function( elem, value, name ) {
4545
			if ( jQuery.nodeName( elem, "input" ) ) {
4546
				// Does not return so that setAttribute is also used
4547
				elem.defaultValue = value;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4548
			} else {
4549
				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
4550
				return nodeHook && nodeHook.set( elem, value, name );
4551
			}
4552
		}
4553
	};
4554
}
4555
4556
// IE6/7 do not support getting/setting some attributes with get/setAttribute
4557
if ( !getSetAttribute ) {
4558
4559
	// Use this for any attribute in IE6/7
4560
	// This fixes almost every IE6/7 issue
4561
	nodeHook = {
4562
		set: function( elem, value, name ) {
4563
			// Set the existing or create a new attribute node
4564
			var ret = elem.getAttributeNode( name );
4565
			if ( !ret ) {
4566
				elem.setAttributeNode(
4567
					(ret = elem.ownerDocument.createAttribute( name ))
4568
				);
4569
			}
4570
4571
			ret.value = value += "";
4572
4573
			// Break association with cloned elements by also using setAttribute (#9646)
4574
			return name === "value" || value === elem.getAttribute( name ) ?
4575
				value :
4576
				undefined;
4577
		}
4578
	};
4579
	jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
4580
		// Some attributes are constructed with empty-string values when not defined
4581
		function( elem, name, isXML ) {
4582
			var ret;
4583
			return isXML ?
4584
				undefined :
4585
				(ret = elem.getAttributeNode( name )) && ret.value !== "" ?
4586
					ret.value :
4587
					null;
4588
		};
4589
	jQuery.valHooks.button = {
4590
		get: function( elem, name ) {
4591
			var ret = elem.getAttributeNode( name );
4592
			return ret && ret.specified ?
4593
				ret.value :
4594
				undefined;
4595
		},
4596
		set: nodeHook.set
4597
	};
4598
4599
	// Set contenteditable to false on removals(#10429)
4600
	// Setting to empty string throws an error as an invalid value
4601
	jQuery.attrHooks.contenteditable = {
4602
		set: function( elem, value, name ) {
4603
			nodeHook.set( elem, value === "" ? false : value, name );
4604
		}
4605
	};
4606
4607
	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
4608
	// This is for removals
4609
	jQuery.each([ "width", "height" ], function( i, name ) {
4610
		jQuery.attrHooks[ name ] = {
4611
			set: function( elem, value ) {
4612
				if ( value === "" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if value === "" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4613
					elem.setAttribute( name, "auto" );
4614
					return value;
4615
				}
4616
			}
4617
		};
4618
	});
4619
}
4620
4621
4622
// Some attributes require a special call on IE
4623
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
4624
if ( !jQuery.support.hrefNormalized ) {
4625
	// href/src property should get the full normalized URL (#10299/#12915)
4626
	jQuery.each([ "href", "src" ], function( i, name ) {
4627
		jQuery.propHooks[ name ] = {
4628
			get: function( elem ) {
4629
				return elem.getAttribute( name, 4 );
4630
			}
4631
		};
4632
	});
4633
}
4634
4635
if ( !jQuery.support.style ) {
4636
	jQuery.attrHooks.style = {
4637
		get: function( elem ) {
4638
			// Return undefined in the case of empty string
4639
			// Note: IE uppercases css property names, but if we were to .toLowerCase()
4640
			// .cssText, that would destroy case senstitivity in URL's, like in "background"
4641
			return elem.style.cssText || undefined;
4642
		},
4643
		set: function( elem, value ) {
4644
			return ( elem.style.cssText = value + "" );
4645
		}
4646
	};
4647
}
4648
4649
// Safari mis-reports the default selected property of an option
4650
// Accessing the parent's selectedIndex property fixes it
4651
if ( !jQuery.support.optSelected ) {
4652
	jQuery.propHooks.selected = {
4653
		get: function( elem ) {
4654
			var parent = elem.parentNode;
4655
4656
			if ( parent ) {
4657
				parent.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.selectedIndex is not used.
Loading history...
4658
4659
				// Make sure that it also works with optgroups, see #5701
4660
				if ( parent.parentNode ) {
4661
					parent.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.parentNode.selectedIndex is not used.
Loading history...
4662
				}
4663
			}
4664
			return null;
4665
		}
4666
	};
4667
}
4668
4669
jQuery.each([
4670
	"tabIndex",
4671
	"readOnly",
4672
	"maxLength",
4673
	"cellSpacing",
4674
	"cellPadding",
4675
	"rowSpan",
4676
	"colSpan",
4677
	"useMap",
4678
	"frameBorder",
4679
	"contentEditable"
4680
], function() {
4681
	jQuery.propFix[ this.toLowerCase() ] = this;
4682
});
4683
4684
// IE6/7 call enctype encoding
4685
if ( !jQuery.support.enctype ) {
4686
	jQuery.propFix.enctype = "encoding";
4687
}
4688
4689
// Radios and checkboxes getter/setter
4690
jQuery.each([ "radio", "checkbox" ], function() {
4691
	jQuery.valHooks[ this ] = {
4692
		set: function( elem, value ) {
4693
			if ( jQuery.isArray( value ) ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.isArray(value) is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4694
				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
4695
			}
4696
		}
4697
	};
4698
	if ( !jQuery.support.checkOn ) {
4699
		jQuery.valHooks[ this ].get = function( elem ) {
4700
			// Support: Webkit
4701
			// "" is returned instead of "on" if a value isn't specified
4702
			return elem.getAttribute("value") === null ? "on" : elem.value;
4703
		};
4704
	}
4705
});
4706
var rformElems = /^(?:input|select|textarea)$/i,
4707
	rkeyEvent = /^key/,
4708
	rmouseEvent = /^(?:mouse|contextmenu)|click/,
4709
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4710
	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4711
4712
function returnTrue() {
4713
	return true;
4714
}
4715
4716
function returnFalse() {
4717
	return false;
4718
}
4719
4720
function safeActiveElement() {
4721
	try {
4722
		return document.activeElement;
4723
	} catch ( err ) { }
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4724
}
4725
4726
/*
4727
 * Helper functions for managing events -- not part of the public interface.
4728
 * Props to Dean Edwards' addEvent library for many of the ideas.
4729
 */
4730
jQuery.event = {
4731
4732
	global: {},
4733
4734
	add: function( elem, types, handler, data, selector ) {
4735
		var tmp, events, t, handleObjIn,
4736
			special, eventHandle, handleObj,
4737
			handlers, type, namespaces, origType,
4738
			elemData = jQuery._data( elem );
4739
4740
		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4741
		if ( !elemData ) {
4742
			return;
4743
		}
4744
4745
		// Caller can pass in an object of custom data in lieu of the handler
4746
		if ( handler.handler ) {
4747
			handleObjIn = handler;
4748
			handler = handleObjIn.handler;
4749
			selector = handleObjIn.selector;
4750
		}
4751
4752
		// Make sure that the handler has a unique ID, used to find/remove it later
4753
		if ( !handler.guid ) {
4754
			handler.guid = jQuery.guid++;
4755
		}
4756
4757
		// Init the element's event structure and main handler, if this is the first
4758
		if ( !(events = elemData.events) ) {
4759
			events = elemData.events = {};
4760
		}
4761
		if ( !(eventHandle = elemData.handle) ) {
4762
			eventHandle = elemData.handle = function( e ) {
4763
				// Discard the second event of a jQuery.event.trigger() and
4764
				// when an event is called after a page has unloaded
4765
				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
4766
					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
4767
					undefined;
4768
			};
4769
			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
4770
			eventHandle.elem = elem;
4771
		}
4772
4773
		// Handle multiple events separated by a space
4774
		types = ( types || "" ).match( core_rnotwhite ) || [""];
4775
		t = types.length;
4776
		while ( t-- ) {
4777
			tmp = rtypenamespace.exec( types[t] ) || [];
4778
			type = origType = tmp[1];
4779
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4780
4781
			// There *must* be a type, no attaching namespace-only handlers
4782
			if ( !type ) {
4783
				continue;
4784
			}
4785
4786
			// If event changes its type, use the special event handlers for the changed type
4787
			special = jQuery.event.special[ type ] || {};
4788
4789
			// If selector defined, determine special event api type, otherwise given type
4790
			type = ( selector ? special.delegateType : special.bindType ) || type;
4791
4792
			// Update special based on newly reset type
4793
			special = jQuery.event.special[ type ] || {};
4794
4795
			// handleObj is passed to all event handlers
4796
			handleObj = jQuery.extend({
4797
				type: type,
4798
				origType: origType,
4799
				data: data,
4800
				handler: handler,
4801
				guid: handler.guid,
4802
				selector: selector,
4803
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4804
				namespace: namespaces.join(".")
4805
			}, handleObjIn );
0 ignored issues
show
Bug introduced by
The variable handleObjIn does not seem to be initialized in case handler.handler on line 4746 is false. Are you sure the function extend handles undefined variables?
Loading history...
4806
4807
			// Init the event handler queue if we're the first
4808
			if ( !(handlers = events[ type ]) ) {
4809
				handlers = events[ type ] = [];
4810
				handlers.delegateCount = 0;
4811
4812
				// Only use addEventListener/attachEvent if the special events handler returns false
4813
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4814
					// Bind the global event handler to the element
4815
					if ( elem.addEventListener ) {
4816
						elem.addEventListener( type, eventHandle, false );
4817
4818
					} else if ( elem.attachEvent ) {
4819
						elem.attachEvent( "on" + type, eventHandle );
4820
					}
4821
				}
4822
			}
4823
4824
			if ( special.add ) {
4825
				special.add.call( elem, handleObj );
4826
4827
				if ( !handleObj.handler.guid ) {
4828
					handleObj.handler.guid = handler.guid;
4829
				}
4830
			}
4831
4832
			// Add to the element's handler list, delegates in front
4833
			if ( selector ) {
4834
				handlers.splice( handlers.delegateCount++, 0, handleObj );
4835
			} else {
4836
				handlers.push( handleObj );
4837
			}
4838
4839
			// Keep track of which events have ever been used, for event optimization
4840
			jQuery.event.global[ type ] = true;
4841
		}
4842
4843
		// Nullify elem to prevent memory leaks in IE
4844
		elem = null;
4845
	},
4846
4847
	// Detach an event or set of events from an element
4848
	remove: function( elem, types, handler, selector, mappedTypes ) {
4849
		var j, handleObj, tmp,
4850
			origCount, t, events,
4851
			special, handlers, type,
4852
			namespaces, origType,
4853
			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
4854
4855
		if ( !elemData || !(events = elemData.events) ) {
4856
			return;
4857
		}
4858
4859
		// Once for each type.namespace in types; type may be omitted
4860
		types = ( types || "" ).match( core_rnotwhite ) || [""];
4861
		t = types.length;
4862
		while ( t-- ) {
4863
			tmp = rtypenamespace.exec( types[t] ) || [];
4864
			type = origType = tmp[1];
4865
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4866
4867
			// Unbind all events (on this namespace, if provided) for the element
4868
			if ( !type ) {
4869
				for ( type in events ) {
4870
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4871
				}
4872
				continue;
4873
			}
4874
4875
			special = jQuery.event.special[ type ] || {};
4876
			type = ( selector ? special.delegateType : special.bindType ) || type;
4877
			handlers = events[ type ] || [];
4878
			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4879
4880
			// Remove matching events
4881
			origCount = j = handlers.length;
4882
			while ( j-- ) {
4883
				handleObj = handlers[ j ];
4884
4885
				if ( ( mappedTypes || origType === handleObj.origType ) &&
4886
					( !handler || handler.guid === handleObj.guid ) &&
4887
					( !tmp || tmp.test( handleObj.namespace ) ) &&
4888
					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4889
					handlers.splice( j, 1 );
4890
4891
					if ( handleObj.selector ) {
4892
						handlers.delegateCount--;
4893
					}
4894
					if ( special.remove ) {
4895
						special.remove.call( elem, handleObj );
4896
					}
4897
				}
4898
			}
4899
4900
			// Remove generic event handler if we removed something and no more handlers exist
4901
			// (avoids potential for endless recursion during removal of special event handlers)
4902
			if ( origCount && !handlers.length ) {
4903
				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4904
					jQuery.removeEvent( elem, type, elemData.handle );
4905
				}
4906
4907
				delete events[ type ];
4908
			}
4909
		}
4910
4911
		// Remove the expando if it's no longer used
4912
		if ( jQuery.isEmptyObject( events ) ) {
4913
			delete elemData.handle;
4914
4915
			// removeData also checks for emptiness and clears the expando if empty
4916
			// so use it instead of delete
4917
			jQuery._removeData( elem, "events" );
4918
		}
4919
	},
4920
4921
	trigger: function( event, data, elem, onlyHandlers ) {
4922
		var handle, ontype, cur,
4923
			bubbleType, special, tmp, i,
4924
			eventPath = [ elem || document ],
4925
			type = core_hasOwn.call( event, "type" ) ? event.type : event,
4926
			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4927
4928
		cur = tmp = elem = elem || document;
4929
4930
		// Don't do events on text and comment nodes
4931
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4932
			return;
4933
		}
4934
4935
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
4936
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4937
			return;
4938
		}
4939
4940
		if ( type.indexOf(".") >= 0 ) {
4941
			// Namespaced trigger; create a regexp to match event type in handle()
4942
			namespaces = type.split(".");
4943
			type = namespaces.shift();
4944
			namespaces.sort();
4945
		}
4946
		ontype = type.indexOf(":") < 0 && "on" + type;
4947
4948
		// Caller can pass in a jQuery.Event object, Object, or just an event type string
4949
		event = event[ jQuery.expando ] ?
4950
			event :
4951
			new jQuery.Event( type, typeof event === "object" && event );
4952
4953
		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4954
		event.isTrigger = onlyHandlers ? 2 : 3;
4955
		event.namespace = namespaces.join(".");
4956
		event.namespace_re = event.namespace ?
4957
			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4958
			null;
4959
4960
		// Clean up the event in case it is being reused
4961
		event.result = undefined;
4962
		if ( !event.target ) {
4963
			event.target = elem;
4964
		}
4965
4966
		// Clone any incoming data and prepend the event, creating the handler arg list
4967
		data = data == null ?
4968
			[ event ] :
4969
			jQuery.makeArray( data, [ event ] );
4970
4971
		// Allow special events to draw outside the lines
4972
		special = jQuery.event.special[ type ] || {};
4973
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4974
			return;
4975
		}
4976
4977
		// Determine event propagation path in advance, per W3C events spec (#9951)
4978
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4979
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4980
4981
			bubbleType = special.delegateType || type;
4982
			if ( !rfocusMorph.test( bubbleType + type ) ) {
4983
				cur = cur.parentNode;
4984
			}
4985
			for ( ; cur; cur = cur.parentNode ) {
4986
				eventPath.push( cur );
4987
				tmp = cur;
4988
			}
4989
4990
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
4991
			if ( tmp === (elem.ownerDocument || document) ) {
4992
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4993
			}
4994
		}
4995
4996
		// Fire handlers on the event path
4997
		i = 0;
4998
		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4999
5000
			event.type = i > 1 ?
5001
				bubbleType :
0 ignored issues
show
Bug introduced by
The variable bubbleType does not seem to be initialized in case !onlyHandlers && !specia... !jQuery.isWindow(elem) on line 4979 is false. Are you sure this can never be the case?
Loading history...
5002
				special.bindType || type;
5003
5004
			// jQuery handler
5005
			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
5006
			if ( handle ) {
5007
				handle.apply( cur, data );
5008
			}
5009
5010
			// Native handler
5011
			handle = ontype && cur[ ontype ];
5012
			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
5013
				event.preventDefault();
5014
			}
5015
		}
5016
		event.type = type;
5017
5018
		// If nobody prevented the default action, do it now
5019
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
5020
5021
			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
5022
				jQuery.acceptData( elem ) ) {
5023
5024
				// Call a native DOM method on the target with the same name name as the event.
5025
				// Can't use an .isFunction() check here because IE6/7 fails that test.
5026
				// Don't do default actions on window, that's where global variables be (#6170)
5027
				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
5028
5029
					// Don't re-trigger an onFOO event when we call its FOO() method
5030
					tmp = elem[ ontype ];
5031
5032
					if ( tmp ) {
5033
						elem[ ontype ] = null;
5034
					}
5035
5036
					// Prevent re-triggering of the same event, since we already bubbled it above
5037
					jQuery.event.triggered = type;
5038
					try {
5039
						elem[ type ]();
5040
					} catch ( e ) {
5041
						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
5042
						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
5043
					}
5044
					jQuery.event.triggered = undefined;
5045
5046
					if ( tmp ) {
5047
						elem[ ontype ] = tmp;
5048
					}
5049
				}
5050
			}
5051
		}
5052
5053
		return event.result;
5054
	},
5055
5056
	dispatch: function( event ) {
5057
5058
		// Make a writable jQuery.Event from the native event object
5059
		event = jQuery.event.fix( event );
5060
5061
		var i, ret, handleObj, matched, j,
5062
			handlerQueue = [],
0 ignored issues
show
Unused Code introduced by
The assignment to variable handlerQueue seems to be never used. Consider removing it.
Loading history...
5063
			args = core_slice.call( arguments ),
5064
			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
5065
			special = jQuery.event.special[ event.type ] || {};
5066
5067
		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5068
		args[0] = event;
5069
		event.delegateTarget = this;
5070
5071
		// Call the preDispatch hook for the mapped type, and let it bail if desired
5072
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5073
			return;
5074
		}
5075
5076
		// Determine handlers
5077
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5078
5079
		// Run delegates first; they may want to stop propagation beneath us
5080
		i = 0;
5081
		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
5082
			event.currentTarget = matched.elem;
5083
5084
			j = 0;
5085
			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
5086
5087
				// Triggered event must either 1) have no namespace, or
5088
				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
5089
				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
5090
5091
					event.handleObj = handleObj;
5092
					event.data = handleObj.data;
5093
5094
					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
5095
							.apply( matched.elem, args );
5096
5097
					if ( ret !== undefined ) {
5098
						if ( (event.result = ret) === false ) {
5099
							event.preventDefault();
5100
							event.stopPropagation();
5101
						}
5102
					}
5103
				}
5104
			}
5105
		}
5106
5107
		// Call the postDispatch hook for the mapped type
5108
		if ( special.postDispatch ) {
5109
			special.postDispatch.call( this, event );
5110
		}
5111
5112
		return event.result;
5113
	},
5114
5115
	handlers: function( event, handlers ) {
5116
		var sel, handleObj, matches, i,
5117
			handlerQueue = [],
5118
			delegateCount = handlers.delegateCount,
5119
			cur = event.target;
5120
5121
		// Find delegate handlers
5122
		// Black-hole SVG <use> instance trees (#13180)
5123
		// Avoid non-left-click bubbling in Firefox (#3861)
5124
		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
5125
5126
			/* jshint eqeqeq: false */
5127
			for ( ; cur != this; cur = cur.parentNode || this ) {
5128
				/* jshint eqeqeq: true */
5129
5130
				// Don't check non-elements (#13208)
5131
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5132
				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
5133
					matches = [];
5134
					for ( i = 0; i < delegateCount; i++ ) {
5135
						handleObj = handlers[ i ];
5136
5137
						// Don't conflict with Object.prototype properties (#13203)
5138
						sel = handleObj.selector + " ";
5139
5140
						if ( matches[ sel ] === undefined ) {
5141
							matches[ sel ] = handleObj.needsContext ?
5142
								jQuery( sel, this ).index( cur ) >= 0 :
5143
								jQuery.find( sel, this, null, [ cur ] ).length;
5144
						}
5145
						if ( matches[ sel ] ) {
5146
							matches.push( handleObj );
5147
						}
5148
					}
5149
					if ( matches.length ) {
5150
						handlerQueue.push({ elem: cur, handlers: matches });
5151
					}
5152
				}
5153
			}
5154
		}
5155
5156
		// Add the remaining (directly-bound) handlers
5157
		if ( delegateCount < handlers.length ) {
5158
			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
5159
		}
5160
5161
		return handlerQueue;
5162
	},
5163
5164
	fix: function( event ) {
5165
		if ( event[ jQuery.expando ] ) {
5166
			return event;
5167
		}
5168
5169
		// Create a writable copy of the event object and normalize some properties
5170
		var i, prop, copy,
5171
			type = event.type,
5172
			originalEvent = event,
5173
			fixHook = this.fixHooks[ type ];
5174
5175
		if ( !fixHook ) {
5176
			this.fixHooks[ type ] = fixHook =
5177
				rmouseEvent.test( type ) ? this.mouseHooks :
5178
				rkeyEvent.test( type ) ? this.keyHooks :
5179
				{};
5180
		}
5181
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
5182
5183
		event = new jQuery.Event( originalEvent );
5184
5185
		i = copy.length;
5186
		while ( i-- ) {
5187
			prop = copy[ i ];
5188
			event[ prop ] = originalEvent[ prop ];
5189
		}
5190
5191
		// Support: IE<9
5192
		// Fix target property (#1925)
5193
		if ( !event.target ) {
5194
			event.target = originalEvent.srcElement || document;
5195
		}
5196
5197
		// Support: Chrome 23+, Safari?
5198
		// Target should not be a text node (#504, #13143)
5199
		if ( event.target.nodeType === 3 ) {
5200
			event.target = event.target.parentNode;
5201
		}
5202
5203
		// Support: IE<9
5204
		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
5205
		event.metaKey = !!event.metaKey;
5206
5207
		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
5208
	},
5209
5210
	// Includes some event props shared by KeyEvent and MouseEvent
5211
	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
5212
5213
	fixHooks: {},
5214
5215
	keyHooks: {
5216
		props: "char charCode key keyCode".split(" "),
5217
		filter: function( event, original ) {
5218
5219
			// Add which for key events
5220
			if ( event.which == null ) {
5221
				event.which = original.charCode != null ? original.charCode : original.keyCode;
5222
			}
5223
5224
			return event;
5225
		}
5226
	},
5227
5228
	mouseHooks: {
5229
		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
5230
		filter: function( event, original ) {
5231
			var body, eventDoc, doc,
5232
				button = original.button,
5233
				fromElement = original.fromElement;
5234
5235
			// Calculate pageX/Y if missing and clientX/Y available
5236
			if ( event.pageX == null && original.clientX != null ) {
5237
				eventDoc = event.target.ownerDocument || document;
5238
				doc = eventDoc.documentElement;
5239
				body = eventDoc.body;
5240
5241
				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
5242
				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
5243
			}
5244
5245
			// Add relatedTarget, if necessary
5246
			if ( !event.relatedTarget && fromElement ) {
5247
				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
5248
			}
5249
5250
			// Add which for click: 1 === left; 2 === middle; 3 === right
5251
			// Note: button is not normalized, so don't use it
5252
			if ( !event.which && button !== undefined ) {
5253
				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
5254
			}
5255
5256
			return event;
5257
		}
5258
	},
5259
5260
	special: {
5261
		load: {
5262
			// Prevent triggered image.load events from bubbling to window.load
5263
			noBubble: true
5264
		},
5265
		focus: {
5266
			// Fire native event if possible so blur/focus sequence is correct
5267
			trigger: function() {
5268
				if ( this !== safeActiveElement() && this.focus ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this !== safeActiveElement() && this.focus is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5269
					try {
5270
						this.focus();
5271
						return false;
5272
					} catch ( e ) {
5273
						// Support: IE<9
5274
						// If we error on focus to hidden element (#1486, #12518),
5275
						// let .trigger() run the handlers
5276
					}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5277
				}
5278
			},
5279
			delegateType: "focusin"
5280
		},
5281
		blur: {
5282
			trigger: function() {
5283
				if ( this === safeActiveElement() && this.blur ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this === safeActiveElement() && this.blur is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5284
					this.blur();
5285
					return false;
5286
				}
5287
			},
5288
			delegateType: "focusout"
5289
		},
5290
		click: {
5291
			// For checkbox, fire native event so checked state will be right
5292
			trigger: function() {
5293
				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.nodeName(this, "i...checkbox" && this.click is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5294
					this.click();
5295
					return false;
5296
				}
5297
			},
5298
5299
			// For cross-browser consistency, don't fire native .click() on links
5300
			_default: function( event ) {
5301
				return jQuery.nodeName( event.target, "a" );
5302
			}
5303
		},
5304
5305
		beforeunload: {
5306
			postDispatch: function( event ) {
5307
5308
				// Even when returnValue equals to undefined Firefox will still show alert
5309
				if ( event.result !== undefined ) {
5310
					event.originalEvent.returnValue = event.result;
5311
				}
5312
			}
5313
		}
5314
	},
5315
5316
	simulate: function( type, elem, event, bubble ) {
5317
		// Piggyback on a donor event to simulate a different one.
5318
		// Fake originalEvent to avoid donor's stopPropagation, but if the
5319
		// simulated event prevents default then we do the same on the donor.
5320
		var e = jQuery.extend(
5321
			new jQuery.Event(),
5322
			event,
5323
			{
5324
				type: type,
5325
				isSimulated: true,
5326
				originalEvent: {}
5327
			}
5328
		);
5329
		if ( bubble ) {
5330
			jQuery.event.trigger( e, null, elem );
5331
		} else {
5332
			jQuery.event.dispatch.call( elem, e );
5333
		}
5334
		if ( e.isDefaultPrevented() ) {
5335
			event.preventDefault();
5336
		}
5337
	}
5338
};
5339
5340
jQuery.removeEvent = document.removeEventListener ?
5341
	function( elem, type, handle ) {
5342
		if ( elem.removeEventListener ) {
5343
			elem.removeEventListener( type, handle, false );
5344
		}
5345
	} :
5346
	function( elem, type, handle ) {
5347
		var name = "on" + type;
5348
5349
		if ( elem.detachEvent ) {
5350
5351
			// #8545, #7054, preventing memory leaks for custom events in IE6-8
5352
			// detachEvent needed property on element, by name of that event, to properly expose it to GC
5353
			if ( typeof elem[ name ] === core_strundefined ) {
5354
				elem[ name ] = null;
5355
			}
5356
5357
			elem.detachEvent( name, handle );
5358
		}
5359
	};
5360
5361
jQuery.Event = function( src, props ) {
5362
	// Allow instantiation without the 'new' keyword
5363
	if ( !(this instanceof jQuery.Event) ) {
5364
		return new jQuery.Event( src, props );
5365
	}
5366
5367
	// Event object
5368
	if ( src && src.type ) {
5369
		this.originalEvent = src;
5370
		this.type = src.type;
5371
5372
		// Events bubbling up the document may have been marked as prevented
5373
		// by a handler lower down the tree; reflect the correct value.
5374
		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
5375
			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
5376
5377
	// Event type
5378
	} else {
5379
		this.type = src;
5380
	}
5381
5382
	// Put explicitly provided properties onto the event object
5383
	if ( props ) {
5384
		jQuery.extend( this, props );
5385
	}
5386
5387
	// Create a timestamp if incoming event doesn't have one
5388
	this.timeStamp = src && src.timeStamp || jQuery.now();
5389
5390
	// Mark it as fixed
5391
	this[ jQuery.expando ] = true;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5392
};
5393
5394
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5395
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5396
jQuery.Event.prototype = {
5397
	isDefaultPrevented: returnFalse,
5398
	isPropagationStopped: returnFalse,
5399
	isImmediatePropagationStopped: returnFalse,
5400
5401
	preventDefault: function() {
5402
		var e = this.originalEvent;
5403
5404
		this.isDefaultPrevented = returnTrue;
5405
		if ( !e ) {
5406
			return;
5407
		}
5408
5409
		// If preventDefault exists, run it on the original event
5410
		if ( e.preventDefault ) {
5411
			e.preventDefault();
5412
5413
		// Support: IE
5414
		// Otherwise set the returnValue property of the original event to false
5415
		} else {
5416
			e.returnValue = false;
5417
		}
5418
	},
5419
	stopPropagation: function() {
5420
		var e = this.originalEvent;
5421
5422
		this.isPropagationStopped = returnTrue;
5423
		if ( !e ) {
5424
			return;
5425
		}
5426
		// If stopPropagation exists, run it on the original event
5427
		if ( e.stopPropagation ) {
5428
			e.stopPropagation();
5429
		}
5430
5431
		// Support: IE
5432
		// Set the cancelBubble property of the original event to true
5433
		e.cancelBubble = true;
5434
	},
5435
	stopImmediatePropagation: function() {
5436
		this.isImmediatePropagationStopped = returnTrue;
5437
		this.stopPropagation();
5438
	}
5439
};
5440
5441
// Create mouseenter/leave events using mouseover/out and event-time checks
5442
jQuery.each({
5443
	mouseenter: "mouseover",
5444
	mouseleave: "mouseout"
5445
}, function( orig, fix ) {
5446
	jQuery.event.special[ orig ] = {
5447
		delegateType: fix,
5448
		bindType: fix,
5449
5450
		handle: function( event ) {
5451
			var ret,
5452
				target = this,
5453
				related = event.relatedTarget,
5454
				handleObj = event.handleObj;
5455
5456
			// For mousenter/leave call the handler if related is outside the target.
5457
			// NB: No relatedTarget if the mouse left/entered the browser window
5458
			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
5459
				event.type = handleObj.origType;
5460
				ret = handleObj.handler.apply( this, arguments );
5461
				event.type = fix;
5462
			}
5463
			return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case !related || related !== ...ntains(target, related) on line 5458 is false. Are you sure this can never be the case?
Loading history...
5464
		}
5465
	};
5466
});
5467
5468
// IE submit delegation
5469
if ( !jQuery.support.submitBubbles ) {
5470
5471
	jQuery.event.special.submit = {
5472
		setup: function() {
5473
			// Only need this for delegated form submit events
5474
			if ( jQuery.nodeName( this, "form" ) ) {
5475
				return false;
5476
			}
5477
5478
			// Lazy-add a submit handler when a descendant form may potentially be submitted
5479
			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
5480
				// Node name check avoids a VML-related crash in IE (#9807)
5481
				var elem = e.target,
5482
					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
5483
				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
5484
					jQuery.event.add( form, "submit._submit", function( event ) {
5485
						event._submit_bubble = true;
5486
					});
5487
					jQuery._data( form, "submitBubbles", true );
5488
				}
5489
			});
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5490
			// return undefined since we don't need an event listener
5491
		},
5492
5493
		postDispatch: function( event ) {
5494
			// If form was submitted by the user, bubble the event up the tree
5495
			if ( event._submit_bubble ) {
5496
				delete event._submit_bubble;
5497
				if ( this.parentNode && !event.isTrigger ) {
5498
					jQuery.event.simulate( "submit", this.parentNode, event, true );
5499
				}
5500
			}
5501
		},
5502
5503
		teardown: function() {
5504
			// Only need this for delegated form submit events
5505
			if ( jQuery.nodeName( this, "form" ) ) {
5506
				return false;
5507
			}
5508
5509
			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5510
			jQuery.event.remove( this, "._submit" );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5511
		}
5512
	};
5513
}
5514
5515
// IE change delegation and checkbox/radio fix
5516
if ( !jQuery.support.changeBubbles ) {
5517
5518
	jQuery.event.special.change = {
5519
5520
		setup: function() {
5521
5522
			if ( rformElems.test( this.nodeName ) ) {
5523
				// IE doesn't fire change on a check/radio until blur; trigger it on click
5524
				// after a propertychange. Eat the blur-change in special.change.handle.
5525
				// This still fires onchange a second time for check/radio after blur.
5526
				if ( this.type === "checkbox" || this.type === "radio" ) {
5527
					jQuery.event.add( this, "propertychange._change", function( event ) {
5528
						if ( event.originalEvent.propertyName === "checked" ) {
5529
							this._just_changed = true;
5530
						}
5531
					});
5532
					jQuery.event.add( this, "click._change", function( event ) {
5533
						if ( this._just_changed && !event.isTrigger ) {
5534
							this._just_changed = false;
5535
						}
5536
						// Allow triggered, simulated change events (#11500)
5537
						jQuery.event.simulate( "change", this, event, true );
5538
					});
5539
				}
5540
				return false;
5541
			}
5542
			// Delegated event; lazy-add a change handler on descendant inputs
5543
			jQuery.event.add( this, "beforeactivate._change", function( e ) {
5544
				var elem = e.target;
5545
5546
				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
5547
					jQuery.event.add( elem, "change._change", function( event ) {
5548
						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
5549
							jQuery.event.simulate( "change", this.parentNode, event, true );
5550
						}
5551
					});
5552
					jQuery._data( elem, "changeBubbles", true );
5553
				}
5554
			});
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5555
		},
5556
5557
		handle: function( event ) {
5558
			var elem = event.target;
5559
5560
			// Swallow native change events from checkbox/radio, we already triggered them above
5561
			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this !== elem || event.i...lem.type !== "checkbox" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5562
				return event.handleObj.handler.apply( this, arguments );
5563
			}
5564
		},
5565
5566
		teardown: function() {
5567
			jQuery.event.remove( this, "._change" );
5568
5569
			return !rformElems.test( this.nodeName );
5570
		}
5571
	};
5572
}
5573
5574
// Create "bubbling" focus and blur events
5575
if ( !jQuery.support.focusinBubbles ) {
5576
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
5577
5578
		// Attach a single capturing handler while someone wants focusin/focusout
5579
		var attaches = 0,
5580
			handler = function( event ) {
5581
				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
5582
			};
5583
5584
		jQuery.event.special[ fix ] = {
5585
			setup: function() {
5586
				if ( attaches++ === 0 ) {
5587
					document.addEventListener( orig, handler, true );
5588
				}
5589
			},
5590
			teardown: function() {
5591
				if ( --attaches === 0 ) {
5592
					document.removeEventListener( orig, handler, true );
5593
				}
5594
			}
5595
		};
5596
	});
5597
}
5598
5599
jQuery.fn.extend({
5600
5601
	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
5602
		var type, origFn;
5603
5604
		// Types can be a map of types/handlers
5605
		if ( typeof types === "object" ) {
5606
			// ( types-Object, selector, data )
5607
			if ( typeof selector !== "string" ) {
5608
				// ( types-Object, data )
5609
				data = data || selector;
5610
				selector = undefined;
5611
			}
5612
			for ( type in types ) {
5613
				this.on( type, selector, data, types[ type ], one );
5614
			}
5615
			return this;
5616
		}
5617
5618
		if ( data == null && fn == null ) {
5619
			// ( types, fn )
5620
			fn = selector;
5621
			data = selector = undefined;
5622
		} else if ( fn == null ) {
5623
			if ( typeof selector === "string" ) {
5624
				// ( types, selector, fn )
5625
				fn = data;
5626
				data = undefined;
5627
			} else {
5628
				// ( types, data, fn )
5629
				fn = data;
5630
				data = selector;
5631
				selector = undefined;
5632
			}
5633
		}
5634
		if ( fn === false ) {
5635
			fn = returnFalse;
5636
		} else if ( !fn ) {
5637
			return this;
5638
		}
5639
5640
		if ( one === 1 ) {
5641
			origFn = fn;
5642
			fn = function( event ) {
5643
				// Can use an empty set, since event contains the info
5644
				jQuery().off( event );
5645
				return origFn.apply( this, arguments );
5646
			};
5647
			// Use same guid so caller can remove using origFn
5648
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5649
		}
5650
		return this.each( function() {
5651
			jQuery.event.add( this, types, fn, data, selector );
5652
		});
5653
	},
5654
	one: function( types, selector, data, fn ) {
5655
		return this.on( types, selector, data, fn, 1 );
5656
	},
5657
	off: function( types, selector, fn ) {
5658
		var handleObj, type;
5659
		if ( types && types.preventDefault && types.handleObj ) {
5660
			// ( event )  dispatched jQuery.Event
5661
			handleObj = types.handleObj;
5662
			jQuery( types.delegateTarget ).off(
5663
				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
5664
				handleObj.selector,
5665
				handleObj.handler
5666
			);
5667
			return this;
5668
		}
5669
		if ( typeof types === "object" ) {
5670
			// ( types-object [, selector] )
5671
			for ( type in types ) {
5672
				this.off( type, selector, types[ type ] );
5673
			}
5674
			return this;
5675
		}
5676
		if ( selector === false || typeof selector === "function" ) {
5677
			// ( types [, fn] )
5678
			fn = selector;
5679
			selector = undefined;
5680
		}
5681
		if ( fn === false ) {
5682
			fn = returnFalse;
5683
		}
5684
		return this.each(function() {
5685
			jQuery.event.remove( this, types, fn, selector );
5686
		});
5687
	},
5688
5689
	trigger: function( type, data ) {
5690
		return this.each(function() {
5691
			jQuery.event.trigger( type, data, this );
5692
		});
5693
	},
5694
	triggerHandler: function( type, data ) {
5695
		var elem = this[0];
5696
		if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5697
			return jQuery.event.trigger( type, data, elem, true );
5698
		}
5699
	}
5700
});
5701
var isSimple = /^.[^:#\[\.,]*$/,
5702
	rparentsprev = /^(?:parents|prev(?:Until|All))/,
5703
	rneedsContext = jQuery.expr.match.needsContext,
5704
	// methods guaranteed to produce a unique set when starting from a unique set
5705
	guaranteedUnique = {
5706
		children: true,
5707
		contents: true,
5708
		next: true,
5709
		prev: true
5710
	};
5711
5712
jQuery.fn.extend({
5713
	find: function( selector ) {
5714
		var i,
5715
			ret = [],
5716
			self = this,
5717
			len = self.length;
5718
5719
		if ( typeof selector !== "string" ) {
5720
			return this.pushStack( jQuery( selector ).filter(function() {
5721
				for ( i = 0; i < len; i++ ) {
0 ignored issues
show
Bug introduced by
The variable i is changed as part of the for loop for example by i++ on line 5721. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
5722
					if ( jQuery.contains( self[ i ], this ) ) {
5723
						return true;
5724
					}
5725
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5726
			}) );
5727
		}
5728
5729
		for ( i = 0; i < len; i++ ) {
5730
			jQuery.find( selector, self[ i ], ret );
5731
		}
5732
5733
		// Needed because $( selector, context ) becomes $( context ).find( selector )
5734
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
5735
		ret.selector = this.selector ? this.selector + " " + selector : selector;
5736
		return ret;
5737
	},
5738
5739
	has: function( target ) {
5740
		var i,
5741
			targets = jQuery( target, this ),
5742
			len = targets.length;
5743
5744
		return this.filter(function() {
5745
			for ( i = 0; i < len; i++ ) {
0 ignored issues
show
Bug introduced by
The variable i is changed as part of the for loop for example by i++ on line 5745. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
5746
				if ( jQuery.contains( this, targets[i] ) ) {
5747
					return true;
5748
				}
5749
			}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5750
		});
5751
	},
5752
5753
	not: function( selector ) {
5754
		return this.pushStack( winnow(this, selector || [], true) );
5755
	},
5756
5757
	filter: function( selector ) {
5758
		return this.pushStack( winnow(this, selector || [], false) );
5759
	},
5760
5761
	is: function( selector ) {
5762
		return !!winnow(
5763
			this,
5764
5765
			// If this is a positional/relative selector, check membership in the returned set
5766
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
5767
			typeof selector === "string" && rneedsContext.test( selector ) ?
5768
				jQuery( selector ) :
5769
				selector || [],
5770
			false
5771
		).length;
5772
	},
5773
5774
	closest: function( selectors, context ) {
5775
		var cur,
5776
			i = 0,
5777
			l = this.length,
5778
			ret = [],
5779
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
5780
				jQuery( selectors, context || this.context ) :
5781
				0;
5782
5783
		for ( ; i < l; i++ ) {
5784
			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
5785
				// Always skip document fragments
5786
				if ( cur.nodeType < 11 && (pos ?
5787
					pos.index(cur) > -1 :
5788
5789
					// Don't pass non-elements to Sizzle
5790
					cur.nodeType === 1 &&
5791
						jQuery.find.matchesSelector(cur, selectors)) ) {
5792
5793
					cur = ret.push( cur );
0 ignored issues
show
Unused Code introduced by
The assignment to variable cur seems to be never used. Consider removing it.
Loading history...
5794
					break;
5795
				}
5796
			}
5797
		}
5798
5799
		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
5800
	},
5801
5802
	// Determine the position of an element within
5803
	// the matched set of elements
5804
	index: function( elem ) {
5805
5806
		// No argument, return index in parent
5807
		if ( !elem ) {
5808
			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
5809
		}
5810
5811
		// index in selector
5812
		if ( typeof elem === "string" ) {
5813
			return jQuery.inArray( this[0], jQuery( elem ) );
5814
		}
5815
5816
		// Locate the position of the desired element
5817
		return jQuery.inArray(
5818
			// If it receives a jQuery object, the first element is used
5819
			elem.jquery ? elem[0] : elem, this );
5820
	},
5821
5822
	add: function( selector, context ) {
5823
		var set = typeof selector === "string" ?
5824
				jQuery( selector, context ) :
5825
				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5826
			all = jQuery.merge( this.get(), set );
5827
5828
		return this.pushStack( jQuery.unique(all) );
5829
	},
5830
5831
	addBack: function( selector ) {
5832
		return this.add( selector == null ?
5833
			this.prevObject : this.prevObject.filter(selector)
5834
		);
5835
	}
5836
});
5837
5838
function sibling( cur, dir ) {
5839
	do {
5840
		cur = cur[ dir ];
5841
	} while ( cur && cur.nodeType !== 1 );
5842
5843
	return cur;
5844
}
5845
5846
jQuery.each({
5847
	parent: function( elem ) {
5848
		var parent = elem.parentNode;
5849
		return parent && parent.nodeType !== 11 ? parent : null;
5850
	},
5851
	parents: function( elem ) {
5852
		return jQuery.dir( elem, "parentNode" );
5853
	},
5854
	parentsUntil: function( elem, i, until ) {
5855
		return jQuery.dir( elem, "parentNode", until );
5856
	},
5857
	next: function( elem ) {
5858
		return sibling( elem, "nextSibling" );
5859
	},
5860
	prev: function( elem ) {
5861
		return sibling( elem, "previousSibling" );
5862
	},
5863
	nextAll: function( elem ) {
5864
		return jQuery.dir( elem, "nextSibling" );
5865
	},
5866
	prevAll: function( elem ) {
5867
		return jQuery.dir( elem, "previousSibling" );
5868
	},
5869
	nextUntil: function( elem, i, until ) {
5870
		return jQuery.dir( elem, "nextSibling", until );
5871
	},
5872
	prevUntil: function( elem, i, until ) {
5873
		return jQuery.dir( elem, "previousSibling", until );
5874
	},
5875
	siblings: function( elem ) {
5876
		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5877
	},
5878
	children: function( elem ) {
5879
		return jQuery.sibling( elem.firstChild );
5880
	},
5881
	contents: function( elem ) {
5882
		return jQuery.nodeName( elem, "iframe" ) ?
5883
			elem.contentDocument || elem.contentWindow.document :
5884
			jQuery.merge( [], elem.childNodes );
5885
	}
5886
}, function( name, fn ) {
5887
	jQuery.fn[ name ] = function( until, selector ) {
5888
		var ret = jQuery.map( this, fn, until );
5889
5890
		if ( name.slice( -5 ) !== "Until" ) {
5891
			selector = until;
5892
		}
5893
5894
		if ( selector && typeof selector === "string" ) {
5895
			ret = jQuery.filter( selector, ret );
5896
		}
5897
5898
		if ( this.length > 1 ) {
5899
			// Remove duplicates
5900
			if ( !guaranteedUnique[ name ] ) {
5901
				ret = jQuery.unique( ret );
5902
			}
5903
5904
			// Reverse order for parents* and prev-derivatives
5905
			if ( rparentsprev.test( name ) ) {
5906
				ret = ret.reverse();
5907
			}
5908
		}
5909
5910
		return this.pushStack( ret );
5911
	};
5912
});
5913
5914
jQuery.extend({
5915
	filter: function( expr, elems, not ) {
5916
		var elem = elems[ 0 ];
5917
5918
		if ( not ) {
5919
			expr = ":not(" + expr + ")";
5920
		}
5921
5922
		return elems.length === 1 && elem.nodeType === 1 ?
5923
			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
5924
			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
5925
				return elem.nodeType === 1;
5926
			}));
5927
	},
5928
5929
	dir: function( elem, dir, until ) {
5930
		var matched = [],
5931
			cur = elem[ dir ];
5932
5933
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5934
			if ( cur.nodeType === 1 ) {
5935
				matched.push( cur );
5936
			}
5937
			cur = cur[dir];
5938
		}
5939
		return matched;
5940
	},
5941
5942
	sibling: function( n, elem ) {
5943
		var r = [];
5944
5945
		for ( ; n; n = n.nextSibling ) {
5946
			if ( n.nodeType === 1 && n !== elem ) {
5947
				r.push( n );
5948
			}
5949
		}
5950
5951
		return r;
5952
	}
5953
});
5954
5955
// Implement the identical functionality for filter and not
5956
function winnow( elements, qualifier, not ) {
5957
	if ( jQuery.isFunction( qualifier ) ) {
5958
		return jQuery.grep( elements, function( elem, i ) {
5959
			/* jshint -W018 */
5960
			return !!qualifier.call( elem, i, elem ) !== not;
5961
		});
5962
5963
	}
5964
5965
	if ( qualifier.nodeType ) {
5966
		return jQuery.grep( elements, function( elem ) {
5967
			return ( elem === qualifier ) !== not;
5968
		});
5969
5970
	}
5971
5972
	if ( typeof qualifier === "string" ) {
5973
		if ( isSimple.test( qualifier ) ) {
5974
			return jQuery.filter( qualifier, elements, not );
5975
		}
5976
5977
		qualifier = jQuery.filter( qualifier, elements );
5978
	}
5979
5980
	return jQuery.grep( elements, function( elem ) {
5981
		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
5982
	});
5983
}
5984
function createSafeFragment( document ) {
5985
	var list = nodeNames.split( "|" ),
5986
		safeFrag = document.createDocumentFragment();
5987
5988
	if ( safeFrag.createElement ) {
5989
		while ( list.length ) {
5990
			safeFrag.createElement(
5991
				list.pop()
5992
			);
5993
		}
5994
	}
5995
	return safeFrag;
5996
}
5997
5998
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5999
		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
6000
	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
6001
	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
6002
	rleadingWhitespace = /^\s+/,
6003
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
6004
	rtagName = /<([\w:]+)/,
6005
	rtbody = /<tbody/i,
6006
	rhtml = /<|&#?\w+;/,
6007
	rnoInnerhtml = /<(?:script|style|link)/i,
6008
	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
6009
	// checked="checked" or checked
6010
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
6011
	rscriptType = /^$|\/(?:java|ecma)script/i,
6012
	rscriptTypeMasked = /^true\/(.*)/,
6013
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
6014
6015
	// We have to close these tags to support XHTML (#13200)
6016
	wrapMap = {
6017
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
6018
		legend: [ 1, "<fieldset>", "</fieldset>" ],
6019
		area: [ 1, "<map>", "</map>" ],
6020
		param: [ 1, "<object>", "</object>" ],
6021
		thead: [ 1, "<table>", "</table>" ],
6022
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
6023
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
6024
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
6025
6026
		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
6027
		// unless wrapped in a div with non-breaking characters in front of it.
6028
		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
6029
	},
6030
	safeFragment = createSafeFragment( document ),
6031
	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
6032
6033
wrapMap.optgroup = wrapMap.option;
6034
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
6035
wrapMap.th = wrapMap.td;
6036
6037
jQuery.fn.extend({
6038
	text: function( value ) {
6039
		return jQuery.access( this, function( value ) {
6040
			return value === undefined ?
6041
				jQuery.text( this ) :
6042
				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
6043
		}, null, value, arguments.length );
6044
	},
6045
6046
	append: function() {
6047
		return this.domManip( arguments, function( elem ) {
6048
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6049
				var target = manipulationTarget( this, elem );
6050
				target.appendChild( elem );
6051
			}
6052
		});
6053
	},
6054
6055
	prepend: function() {
6056
		return this.domManip( arguments, function( elem ) {
6057
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6058
				var target = manipulationTarget( this, elem );
6059
				target.insertBefore( elem, target.firstChild );
6060
			}
6061
		});
6062
	},
6063
6064
	before: function() {
6065
		return this.domManip( arguments, function( elem ) {
6066
			if ( this.parentNode ) {
6067
				this.parentNode.insertBefore( elem, this );
6068
			}
6069
		});
6070
	},
6071
6072
	after: function() {
6073
		return this.domManip( arguments, function( elem ) {
6074
			if ( this.parentNode ) {
6075
				this.parentNode.insertBefore( elem, this.nextSibling );
6076
			}
6077
		});
6078
	},
6079
6080
	// keepData is for internal use only--do not document
6081
	remove: function( selector, keepData ) {
6082
		var elem,
6083
			elems = selector ? jQuery.filter( selector, this ) : this,
6084
			i = 0;
6085
6086
		for ( ; (elem = elems[i]) != null; i++ ) {
6087
6088
			if ( !keepData && elem.nodeType === 1 ) {
6089
				jQuery.cleanData( getAll( elem ) );
6090
			}
6091
6092
			if ( elem.parentNode ) {
6093
				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
6094
					setGlobalEval( getAll( elem, "script" ) );
6095
				}
6096
				elem.parentNode.removeChild( elem );
6097
			}
6098
		}
6099
6100
		return this;
6101
	},
6102
6103
	empty: function() {
6104
		var elem,
6105
			i = 0;
6106
6107
		for ( ; (elem = this[i]) != null; i++ ) {
6108
			// Remove element nodes and prevent memory leaks
6109
			if ( elem.nodeType === 1 ) {
6110
				jQuery.cleanData( getAll( elem, false ) );
6111
			}
6112
6113
			// Remove any remaining nodes
6114
			while ( elem.firstChild ) {
6115
				elem.removeChild( elem.firstChild );
6116
			}
6117
6118
			// If this is a select, ensure that it displays empty (#12336)
6119
			// Support: IE<9
6120
			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
6121
				elem.options.length = 0;
6122
			}
6123
		}
6124
6125
		return this;
6126
	},
6127
6128
	clone: function( dataAndEvents, deepDataAndEvents ) {
6129
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6130
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6131
6132
		return this.map( function () {
6133
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6134
		});
6135
	},
6136
6137
	html: function( value ) {
6138
		return jQuery.access( this, function( value ) {
6139
			var elem = this[0] || {},
6140
				i = 0,
6141
				l = this.length;
6142
6143
			if ( value === undefined ) {
6144
				return elem.nodeType === 1 ?
6145
					elem.innerHTML.replace( rinlinejQuery, "" ) :
6146
					undefined;
6147
			}
6148
6149
			// See if we can take a shortcut and just use innerHTML
6150
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6151
				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
6152
				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
6153
				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
6154
6155
				value = value.replace( rxhtmlTag, "<$1></$2>" );
6156
6157
				try {
6158
					for (; i < l; i++ ) {
6159
						// Remove element nodes and prevent memory leaks
6160
						elem = this[i] || {};
6161
						if ( elem.nodeType === 1 ) {
6162
							jQuery.cleanData( getAll( elem, false ) );
6163
							elem.innerHTML = value;
6164
						}
6165
					}
6166
6167
					elem = 0;
6168
6169
				// If using innerHTML throws an exception, use the fallback method
6170
				} catch(e) {}
6171
			}
6172
6173
			if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6174
				this.empty().append( value );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
6175
			}
6176
		}, null, value, arguments.length );
6177
	},
6178
6179
	replaceWith: function() {
6180
		var
6181
			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
6182
			args = jQuery.map( this, function( elem ) {
6183
				return [ elem.nextSibling, elem.parentNode ];
6184
			}),
6185
			i = 0;
6186
6187
		// Make the changes, replacing each context element with the new content
6188
		this.domManip( arguments, function( elem ) {
6189
			var next = args[ i++ ],
6190
				parent = args[ i++ ];
6191
6192
			if ( parent ) {
6193
				// Don't use the snapshot next if it has moved (#13810)
6194
				if ( next && next.parentNode !== parent ) {
6195
					next = this.nextSibling;
6196
				}
6197
				jQuery( this ).remove();
6198
				parent.insertBefore( elem, next );
6199
			}
6200
		// Allow new content to include elements from the context set
6201
		}, true );
6202
6203
		// Force removal if there was no new content (e.g., from empty arguments)
6204
		return i ? this : this.remove();
6205
	},
6206
6207
	detach: function( selector ) {
6208
		return this.remove( selector, true );
6209
	},
6210
6211
	domManip: function( args, callback, allowIntersection ) {
6212
6213
		// Flatten any nested arrays
6214
		args = core_concat.apply( [], args );
6215
6216
		var first, node, hasScripts,
6217
			scripts, doc, fragment,
6218
			i = 0,
6219
			l = this.length,
6220
			set = this,
6221
			iNoClone = l - 1,
6222
			value = args[0],
6223
			isFunction = jQuery.isFunction( value );
6224
6225
		// We can't cloneNode fragments that contain checked, in WebKit
6226
		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
6227
			return this.each(function( index ) {
6228
				var self = set.eq( index );
6229
				if ( isFunction ) {
6230
					args[0] = value.call( this, index, self.html() );
6231
				}
6232
				self.domManip( args, callback, allowIntersection );
6233
			});
6234
		}
6235
6236
		if ( l ) {
6237
			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
6238
			first = fragment.firstChild;
6239
6240
			if ( fragment.childNodes.length === 1 ) {
6241
				fragment = first;
6242
			}
6243
6244
			if ( first ) {
6245
				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6246
				hasScripts = scripts.length;
6247
6248
				// Use the original fragment for the last item instead of the first because it can end up
6249
				// being emptied incorrectly in certain situations (#8070).
6250
				for ( ; i < l; i++ ) {
6251
					node = fragment;
6252
6253
					if ( i !== iNoClone ) {
6254
						node = jQuery.clone( node, true, true );
6255
6256
						// Keep references to cloned scripts for later restoration
6257
						if ( hasScripts ) {
6258
							jQuery.merge( scripts, getAll( node, "script" ) );
6259
						}
6260
					}
6261
6262
					callback.call( this[i], node, i );
6263
				}
6264
6265
				if ( hasScripts ) {
6266
					doc = scripts[ scripts.length - 1 ].ownerDocument;
6267
6268
					// Reenable scripts
6269
					jQuery.map( scripts, restoreScript );
6270
6271
					// Evaluate executable scripts on first document insertion
6272
					for ( i = 0; i < hasScripts; i++ ) {
6273
						node = scripts[ i ];
6274
						if ( rscriptType.test( node.type || "" ) &&
6275
							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
6276
6277
							if ( node.src ) {
6278
								// Hope ajax is available...
6279
								jQuery._evalUrl( node.src );
6280
							} else {
6281
								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
6282
							}
6283
						}
6284
					}
6285
				}
6286
6287
				// Fix #11809: Avoid leaking memory
6288
				fragment = first = null;
0 ignored issues
show
Unused Code introduced by
The assignment to first seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable fragment seems to be never used. Consider removing it.
Loading history...
6289
			}
6290
		}
6291
6292
		return this;
6293
	}
6294
});
6295
6296
// Support: IE<8
6297
// Manipulating tables requires a tbody
6298
function manipulationTarget( elem, content ) {
6299
	return jQuery.nodeName( elem, "table" ) &&
6300
		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
6301
6302
		elem.getElementsByTagName("tbody")[0] ||
6303
			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
6304
		elem;
6305
}
6306
6307
// Replace/restore the type attribute of script elements for safe DOM manipulation
6308
function disableScript( elem ) {
6309
	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
6310
	return elem;
6311
}
6312
function restoreScript( elem ) {
6313
	var match = rscriptTypeMasked.exec( elem.type );
6314
	if ( match ) {
6315
		elem.type = match[1];
6316
	} else {
6317
		elem.removeAttribute("type");
6318
	}
6319
	return elem;
6320
}
6321
6322
// Mark scripts as having already been evaluated
6323
function setGlobalEval( elems, refElements ) {
6324
	var elem,
6325
		i = 0;
6326
	for ( ; (elem = elems[i]) != null; i++ ) {
6327
		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
6328
	}
6329
}
6330
6331
function cloneCopyEvent( src, dest ) {
6332
6333
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6334
		return;
6335
	}
6336
6337
	var type, i, l,
6338
		oldData = jQuery._data( src ),
6339
		curData = jQuery._data( dest, oldData ),
6340
		events = oldData.events;
6341
6342
	if ( events ) {
6343
		delete curData.handle;
6344
		curData.events = {};
6345
6346
		for ( type in events ) {
6347
			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6348
				jQuery.event.add( dest, type, events[ type ][ i ] );
6349
			}
6350
		}
6351
	}
6352
6353
	// make the cloned public data object a copy from the original
6354
	if ( curData.data ) {
6355
		curData.data = jQuery.extend( {}, curData.data );
6356
	}
6357
}
6358
6359
function fixCloneNodeIssues( src, dest ) {
6360
	var nodeName, e, data;
6361
6362
	// We do not need to do anything for non-Elements
6363
	if ( dest.nodeType !== 1 ) {
6364
		return;
6365
	}
6366
6367
	nodeName = dest.nodeName.toLowerCase();
6368
6369
	// IE6-8 copies events bound via attachEvent when using cloneNode.
6370
	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
6371
		data = jQuery._data( dest );
6372
6373
		for ( e in data.events ) {
6374
			jQuery.removeEvent( dest, e, data.handle );
6375
		}
6376
6377
		// Event data gets referenced instead of copied if the expando gets copied too
6378
		dest.removeAttribute( jQuery.expando );
6379
	}
6380
6381
	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
6382
	if ( nodeName === "script" && dest.text !== src.text ) {
6383
		disableScript( dest ).text = src.text;
6384
		restoreScript( dest );
6385
6386
	// IE6-10 improperly clones children of object elements using classid.
6387
	// IE10 throws NoModificationAllowedError if parent is null, #12132.
6388
	} else if ( nodeName === "object" ) {
6389
		if ( dest.parentNode ) {
6390
			dest.outerHTML = src.outerHTML;
6391
		}
6392
6393
		// This path appears unavoidable for IE9. When cloning an object
6394
		// element in IE9, the outerHTML strategy above is not sufficient.
6395
		// If the src has innerHTML and the destination does not,
6396
		// copy the src.innerHTML into the dest.innerHTML. #10324
6397
		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
6398
			dest.innerHTML = src.innerHTML;
6399
		}
6400
6401
	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
6402
		// IE6-8 fails to persist the checked state of a cloned checkbox
6403
		// or radio button. Worse, IE6-7 fail to give the cloned element
6404
		// a checked appearance if the defaultChecked value isn't also set
6405
6406
		dest.defaultChecked = dest.checked = src.checked;
6407
6408
		// IE6-7 get confused and end up setting the value of a cloned
6409
		// checkbox/radio button to an empty string instead of "on"
6410
		if ( dest.value !== src.value ) {
6411
			dest.value = src.value;
6412
		}
6413
6414
	// IE6-8 fails to return the selected option to the default selected
6415
	// state when cloning options
6416
	} else if ( nodeName === "option" ) {
6417
		dest.defaultSelected = dest.selected = src.defaultSelected;
6418
6419
	// IE6-8 fails to set the defaultValue to the correct value when
6420
	// cloning other types of input fields
6421
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6422
		dest.defaultValue = src.defaultValue;
6423
	}
6424
}
6425
6426
jQuery.each({
6427
	appendTo: "append",
6428
	prependTo: "prepend",
6429
	insertBefore: "before",
6430
	insertAfter: "after",
6431
	replaceAll: "replaceWith"
6432
}, function( name, original ) {
6433
	jQuery.fn[ name ] = function( selector ) {
6434
		var elems,
6435
			i = 0,
6436
			ret = [],
6437
			insert = jQuery( selector ),
6438
			last = insert.length - 1;
6439
6440
		for ( ; i <= last; i++ ) {
6441
			elems = i === last ? this : this.clone(true);
6442
			jQuery( insert[i] )[ original ]( elems );
6443
6444
			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6445
			core_push.apply( ret, elems.get() );
6446
		}
6447
6448
		return this.pushStack( ret );
6449
	};
6450
});
6451
6452
function getAll( context, tag ) {
6453
	var elems, elem,
6454
		i = 0,
6455
		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
6456
			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
6457
			undefined;
6458
6459
	if ( !found ) {
6460
		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
6461
			if ( !tag || jQuery.nodeName( elem, tag ) ) {
6462
				found.push( elem );
6463
			} else {
6464
				jQuery.merge( found, getAll( elem, tag ) );
6465
			}
6466
		}
6467
	}
6468
6469
	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
6470
		jQuery.merge( [ context ], found ) :
6471
		found;
6472
}
6473
6474
// Used in buildFragment, fixes the defaultChecked property
6475
function fixDefaultChecked( elem ) {
6476
	if ( manipulation_rcheckableType.test( elem.type ) ) {
6477
		elem.defaultChecked = elem.checked;
6478
	}
6479
}
6480
6481
jQuery.extend({
6482
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6483
		var destElements, node, clone, i, srcElements,
6484
			inPage = jQuery.contains( elem.ownerDocument, elem );
6485
6486
		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
6487
			clone = elem.cloneNode( true );
6488
6489
		// IE<=8 does not properly clone detached, unknown element nodes
6490
		} else {
6491
			fragmentDiv.innerHTML = elem.outerHTML;
6492
			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
6493
		}
6494
6495
		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6496
				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6497
6498
			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
6499
			destElements = getAll( clone );
6500
			srcElements = getAll( elem );
6501
6502
			// Fix all IE cloning issues
6503
			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
6504
				// Ensure that the destination node is not null; Fixes #9587
6505
				if ( destElements[i] ) {
6506
					fixCloneNodeIssues( node, destElements[i] );
6507
				}
6508
			}
6509
		}
6510
6511
		// Copy the events from the original to the clone
6512
		if ( dataAndEvents ) {
6513
			if ( deepDataAndEvents ) {
6514
				srcElements = srcElements || getAll( elem );
6515
				destElements = destElements || getAll( clone );
6516
6517
				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
6518
					cloneCopyEvent( node, destElements[i] );
6519
				}
6520
			} else {
6521
				cloneCopyEvent( elem, clone );
6522
			}
6523
		}
6524
6525
		// Preserve script evaluation history
6526
		destElements = getAll( clone, "script" );
6527
		if ( destElements.length > 0 ) {
6528
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6529
		}
6530
6531
		destElements = srcElements = node = null;
0 ignored issues
show
Unused Code introduced by
The assignment to variable destElements seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to node seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable srcElements seems to be never used. Consider removing it.
Loading history...
6532
6533
		// Return the cloned set
6534
		return clone;
6535
	},
6536
6537
	buildFragment: function( elems, context, scripts, selection ) {
6538
		var j, elem, contains,
6539
			tmp, tag, tbody, wrap,
6540
			l = elems.length,
6541
6542
			// Ensure a safe fragment
6543
			safe = createSafeFragment( context ),
6544
6545
			nodes = [],
6546
			i = 0;
6547
6548
		for ( ; i < l; i++ ) {
6549
			elem = elems[ i ];
6550
6551
			if ( elem || elem === 0 ) {
6552
6553
				// Add nodes directly
6554
				if ( jQuery.type( elem ) === "object" ) {
6555
					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
6556
6557
				// Convert non-html into a text node
6558
				} else if ( !rhtml.test( elem ) ) {
6559
					nodes.push( context.createTextNode( elem ) );
6560
6561
				// Convert html into DOM nodes
6562
				} else {
6563
					tmp = tmp || safe.appendChild( context.createElement("div") );
6564
6565
					// Deserialize a standard representation
6566
					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
6567
					wrap = wrapMap[ tag ] || wrapMap._default;
6568
6569
					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
6570
6571
					// Descend through wrappers to the right content
6572
					j = wrap[0];
6573
					while ( j-- ) {
6574
						tmp = tmp.lastChild;
6575
					}
6576
6577
					// Manually add leading whitespace removed by IE
6578
					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6579
						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
6580
					}
6581
6582
					// Remove IE's autoinserted <tbody> from table fragments
6583
					if ( !jQuery.support.tbody ) {
6584
6585
						// String was a <table>, *may* have spurious <tbody>
6586
						elem = tag === "table" && !rtbody.test( elem ) ?
6587
							tmp.firstChild :
6588
6589
							// String was a bare <thead> or <tfoot>
6590
							wrap[1] === "<table>" && !rtbody.test( elem ) ?
6591
								tmp :
6592
								0;
6593
6594
						j = elem && elem.childNodes.length;
6595
						while ( j-- ) {
6596
							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
6597
								elem.removeChild( tbody );
6598
							}
6599
						}
6600
					}
6601
6602
					jQuery.merge( nodes, tmp.childNodes );
6603
6604
					// Fix #12392 for WebKit and IE > 9
6605
					tmp.textContent = "";
6606
6607
					// Fix #12392 for oldIE
6608
					while ( tmp.firstChild ) {
6609
						tmp.removeChild( tmp.firstChild );
6610
					}
6611
6612
					// Remember the top-level container for proper cleanup
6613
					tmp = safe.lastChild;
6614
				}
6615
			}
6616
		}
6617
6618
		// Fix #11356: Clear elements from fragment
6619
		if ( tmp ) {
6620
			safe.removeChild( tmp );
6621
		}
6622
6623
		// Reset defaultChecked for any radios and checkboxes
6624
		// about to be appended to the DOM in IE 6/7 (#8060)
6625
		if ( !jQuery.support.appendChecked ) {
6626
			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
6627
		}
6628
6629
		i = 0;
6630
		while ( (elem = nodes[ i++ ]) ) {
6631
6632
			// #4087 - If origin and destination elements are the same, and this is
6633
			// that element, do not do anything
6634
			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
6635
				continue;
6636
			}
6637
6638
			contains = jQuery.contains( elem.ownerDocument, elem );
6639
6640
			// Append to fragment
6641
			tmp = getAll( safe.appendChild( elem ), "script" );
6642
6643
			// Preserve script evaluation history
6644
			if ( contains ) {
6645
				setGlobalEval( tmp );
6646
			}
6647
6648
			// Capture executables
6649
			if ( scripts ) {
6650
				j = 0;
6651
				while ( (elem = tmp[ j++ ]) ) {
6652
					if ( rscriptType.test( elem.type || "" ) ) {
6653
						scripts.push( elem );
6654
					}
6655
				}
6656
			}
6657
		}
6658
6659
		tmp = null;
0 ignored issues
show
Unused Code introduced by
The assignment to tmp seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
6660
6661
		return safe;
6662
	},
6663
6664
	cleanData: function( elems, /* internal */ acceptData ) {
6665
		var elem, type, id, data,
6666
			i = 0,
6667
			internalKey = jQuery.expando,
6668
			cache = jQuery.cache,
6669
			deleteExpando = jQuery.support.deleteExpando,
6670
			special = jQuery.event.special;
6671
6672
		for ( ; (elem = elems[i]) != null; i++ ) {
6673
6674
			if ( acceptData || jQuery.acceptData( elem ) ) {
6675
6676
				id = elem[ internalKey ];
6677
				data = id && cache[ id ];
6678
6679
				if ( data ) {
6680
					if ( data.events ) {
6681
						for ( type in data.events ) {
6682
							if ( special[ type ] ) {
6683
								jQuery.event.remove( elem, type );
6684
6685
							// This is a shortcut to avoid jQuery.event.remove's overhead
6686
							} else {
6687
								jQuery.removeEvent( elem, type, data.handle );
6688
							}
6689
						}
6690
					}
6691
6692
					// Remove cache only if it was not already removed by jQuery.event.remove
6693
					if ( cache[ id ] ) {
6694
6695
						delete cache[ id ];
6696
6697
						// IE does not allow us to delete expando properties from nodes,
6698
						// nor does it have a removeAttribute function on Document nodes;
6699
						// we must handle all of these cases
6700
						if ( deleteExpando ) {
6701
							delete elem[ internalKey ];
6702
6703
						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
6704
							elem.removeAttribute( internalKey );
6705
6706
						} else {
6707
							elem[ internalKey ] = null;
6708
						}
6709
6710
						core_deletedIds.push( id );
6711
					}
6712
				}
6713
			}
6714
		}
6715
	},
6716
6717
	_evalUrl: function( url ) {
6718
		return jQuery.ajax({
6719
			url: url,
6720
			type: "GET",
6721
			dataType: "script",
6722
			async: false,
6723
			global: false,
6724
			"throws": true
6725
		});
6726
	}
6727
});
6728
jQuery.fn.extend({
6729
	wrapAll: function( html ) {
6730
		if ( jQuery.isFunction( html ) ) {
6731
			return this.each(function(i) {
6732
				jQuery(this).wrapAll( html.call(this, i) );
6733
			});
6734
		}
6735
6736
		if ( this[0] ) {
6737
			// The elements to wrap the target around
6738
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
6739
6740
			if ( this[0].parentNode ) {
6741
				wrap.insertBefore( this[0] );
6742
			}
6743
6744
			wrap.map(function() {
6745
				var elem = this;
6746
6747
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
6748
					elem = elem.firstChild;
6749
				}
6750
6751
				return elem;
6752
			}).append( this );
6753
		}
6754
6755
		return this;
6756
	},
6757
6758
	wrapInner: function( html ) {
6759
		if ( jQuery.isFunction( html ) ) {
6760
			return this.each(function(i) {
6761
				jQuery(this).wrapInner( html.call(this, i) );
6762
			});
6763
		}
6764
6765
		return this.each(function() {
6766
			var self = jQuery( this ),
6767
				contents = self.contents();
6768
6769
			if ( contents.length ) {
6770
				contents.wrapAll( html );
6771
6772
			} else {
6773
				self.append( html );
6774
			}
6775
		});
6776
	},
6777
6778
	wrap: function( html ) {
6779
		var isFunction = jQuery.isFunction( html );
6780
6781
		return this.each(function(i) {
6782
			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
6783
		});
6784
	},
6785
6786
	unwrap: function() {
6787
		return this.parent().each(function() {
6788
			if ( !jQuery.nodeName( this, "body" ) ) {
6789
				jQuery( this ).replaceWith( this.childNodes );
6790
			}
6791
		}).end();
6792
	}
6793
});
6794
var iframe, getStyles, curCSS,
6795
	ralpha = /alpha\([^)]*\)/i,
6796
	ropacity = /opacity\s*=\s*([^)]*)/,
6797
	rposition = /^(top|right|bottom|left)$/,
6798
	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6799
	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6800
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6801
	rmargin = /^margin/,
6802
	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
6803
	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
6804
	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
6805
	elemdisplay = { BODY: "block" },
6806
6807
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6808
	cssNormalTransform = {
6809
		letterSpacing: 0,
6810
		fontWeight: 400
6811
	},
6812
6813
	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
6814
	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6815
6816
// return a css property mapped to a potentially vendor prefixed property
6817
function vendorPropName( style, name ) {
6818
6819
	// shortcut for names that are not vendor prefixed
6820
	if ( name in style ) {
6821
		return name;
6822
	}
6823
6824
	// check for vendor prefixed names
6825
	var capName = name.charAt(0).toUpperCase() + name.slice(1),
6826
		origName = name,
6827
		i = cssPrefixes.length;
6828
6829
	while ( i-- ) {
6830
		name = cssPrefixes[ i ] + capName;
6831
		if ( name in style ) {
6832
			return name;
6833
		}
6834
	}
6835
6836
	return origName;
6837
}
6838
6839
function isHidden( elem, el ) {
6840
	// isHidden might be called from jQuery#filter function;
6841
	// in that case, element will be second argument
6842
	elem = el || elem;
6843
	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
6844
}
6845
6846
function showHide( elements, show ) {
6847
	var display, elem, hidden,
6848
		values = [],
6849
		index = 0,
6850
		length = elements.length;
6851
6852
	for ( ; index < length; index++ ) {
6853
		elem = elements[ index ];
6854
		if ( !elem.style ) {
6855
			continue;
6856
		}
6857
6858
		values[ index ] = jQuery._data( elem, "olddisplay" );
6859
		display = elem.style.display;
6860
		if ( show ) {
6861
			// Reset the inline display of this element to learn if it is
6862
			// being hidden by cascaded rules or not
6863
			if ( !values[ index ] && display === "none" ) {
6864
				elem.style.display = "";
6865
			}
6866
6867
			// Set elements which have been overridden with display: none
6868
			// in a stylesheet to whatever the default browser style is
6869
			// for such an element
6870
			if ( elem.style.display === "" && isHidden( elem ) ) {
6871
				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
6872
			}
6873
		} else {
6874
6875
			if ( !values[ index ] ) {
6876
				hidden = isHidden( elem );
6877
6878
				if ( display && display !== "none" || !hidden ) {
6879
					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6880
				}
6881
			}
6882
		}
6883
	}
6884
6885
	// Set the display of most of the elements in a second loop
6886
	// to avoid the constant reflow
6887
	for ( index = 0; index < length; index++ ) {
6888
		elem = elements[ index ];
6889
		if ( !elem.style ) {
6890
			continue;
6891
		}
6892
		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6893
			elem.style.display = show ? values[ index ] || "" : "none";
6894
		}
6895
	}
6896
6897
	return elements;
6898
}
6899
6900
jQuery.fn.extend({
6901
	css: function( name, value ) {
6902
		return jQuery.access( this, function( elem, name, value ) {
6903
			var len, styles,
6904
				map = {},
6905
				i = 0;
6906
6907
			if ( jQuery.isArray( name ) ) {
6908
				styles = getStyles( elem );
6909
				len = name.length;
6910
6911
				for ( ; i < len; i++ ) {
6912
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6913
				}
6914
6915
				return map;
6916
			}
6917
6918
			return value !== undefined ?
6919
				jQuery.style( elem, name, value ) :
6920
				jQuery.css( elem, name );
6921
		}, name, value, arguments.length > 1 );
6922
	},
6923
	show: function() {
6924
		return showHide( this, true );
6925
	},
6926
	hide: function() {
6927
		return showHide( this );
6928
	},
6929
	toggle: function( state ) {
6930
		if ( typeof state === "boolean" ) {
6931
			return state ? this.show() : this.hide();
6932
		}
6933
6934
		return this.each(function() {
6935
			if ( isHidden( this ) ) {
6936
				jQuery( this ).show();
6937
			} else {
6938
				jQuery( this ).hide();
6939
			}
6940
		});
6941
	}
6942
});
6943
6944
jQuery.extend({
6945
	// Add in style property hooks for overriding the default
6946
	// behavior of getting and setting a style property
6947
	cssHooks: {
6948
		opacity: {
6949
			get: function( elem, computed ) {
6950
				if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6951
					// We should always get a number back from opacity
6952
					var ret = curCSS( elem, "opacity" );
6953
					return ret === "" ? "1" : ret;
6954
				}
6955
			}
6956
		}
6957
	},
6958
6959
	// Don't automatically add "px" to these possibly-unitless properties
6960
	cssNumber: {
6961
		"columnCount": true,
6962
		"fillOpacity": true,
6963
		"fontWeight": true,
6964
		"lineHeight": true,
6965
		"opacity": true,
6966
		"order": true,
6967
		"orphans": true,
6968
		"widows": true,
6969
		"zIndex": true,
6970
		"zoom": true
6971
	},
6972
6973
	// Add in properties whose names you wish to fix before
6974
	// setting or getting the value
6975
	cssProps: {
6976
		// normalize float css property
6977
		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6978
	},
6979
6980
	// Get and set the style property on a DOM Node
6981
	style: function( elem, name, value, extra ) {
6982
		// Don't set styles on text and comment nodes
6983
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6984
			return;
6985
		}
6986
6987
		// Make sure that we're working with the right name
6988
		var ret, type, hooks,
6989
			origName = jQuery.camelCase( name ),
6990
			style = elem.style;
6991
6992
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6993
6994
		// gets hook for the prefixed version
6995
		// followed by the unprefixed version
6996
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6997
6998
		// Check if we're setting a value
6999
		if ( value !== undefined ) {
7000
			type = typeof value;
7001
7002
			// convert relative number strings (+= or -=) to relative numbers. #7345
7003
			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
7004
				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
7005
				// Fixes bug #9237
7006
				type = "number";
7007
			}
7008
7009
			// Make sure that NaN and null values aren't set. See: #7116
7010
			if ( value == null || type === "number" && isNaN( value ) ) {
7011
				return;
7012
			}
7013
7014
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
7015
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
7016
				value += "px";
7017
			}
7018
7019
			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
7020
			// but it would mean to define eight (for every problematic property) identical functions
7021
			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
7022
				style[ name ] = "inherit";
7023
			}
7024
7025
			// If a hook was provided, use that value, otherwise just set the specified value
7026
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !hooks || !("set" in hoo...e, extra) !== undefined is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7027
7028
				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
7029
				// Fixes bug #5509
7030
				try {
7031
					style[ name ] = value;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
7032
				} catch(e) {}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
7033
			}
7034
7035
		} else {
7036
			// If a hook was provided get the non-computed value from there
7037
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
7038
				return ret;
7039
			}
7040
7041
			// Otherwise just get the value from the style object
7042
			return style[ name ];
7043
		}
7044
	},
7045
7046
	css: function( elem, name, extra, styles ) {
7047
		var num, val, hooks,
7048
			origName = jQuery.camelCase( name );
7049
7050
		// Make sure that we're working with the right name
7051
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
7052
7053
		// gets hook for the prefixed version
7054
		// followed by the unprefixed version
7055
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
7056
7057
		// If a hook was provided get the computed value from there
7058
		if ( hooks && "get" in hooks ) {
7059
			val = hooks.get( elem, true, extra );
7060
		}
7061
7062
		// Otherwise, if a way to get the computed value exists, use that
7063
		if ( val === undefined ) {
0 ignored issues
show
Bug introduced by
The variable val does not seem to be initialized in case hooks && "get" in hooks on line 7058 is false. Are you sure this can never be the case?
Loading history...
7064
			val = curCSS( elem, name, styles );
7065
		}
7066
7067
		//convert "normal" to computed value
7068
		if ( val === "normal" && name in cssNormalTransform ) {
7069
			val = cssNormalTransform[ name ];
7070
		}
7071
7072
		// Return, converting to number if forced or a qualifier was provided and val looks numeric
7073
		if ( extra === "" || extra ) {
7074
			num = parseFloat( val );
7075
			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
7076
		}
7077
		return val;
7078
	}
7079
});
7080
7081
// NOTE: we've included the "window" in window.getComputedStyle
7082
// because jsdom on node.js will break without it.
7083
if ( window.getComputedStyle ) {
7084
	getStyles = function( elem ) {
7085
		return window.getComputedStyle( elem, null );
7086
	};
7087
7088
	curCSS = function( elem, name, _computed ) {
7089
		var width, minWidth, maxWidth,
7090
			computed = _computed || getStyles( elem ),
7091
7092
			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
7093
			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
7094
			style = elem.style;
7095
7096
		if ( computed ) {
7097
7098
			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
7099
				ret = jQuery.style( elem, name );
7100
			}
7101
7102
			// A tribute to the "awesome hack by Dean Edwards"
7103
			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
7104
			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
7105
			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
7106
			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
7107
7108
				// Remember the original values
7109
				width = style.width;
7110
				minWidth = style.minWidth;
7111
				maxWidth = style.maxWidth;
7112
7113
				// Put in the new values to get a computed value out
7114
				style.minWidth = style.maxWidth = style.width = ret;
7115
				ret = computed.width;
7116
7117
				// Revert the changed values
7118
				style.width = width;
7119
				style.minWidth = minWidth;
7120
				style.maxWidth = maxWidth;
7121
			}
7122
		}
7123
7124
		return ret;
7125
	};
7126
} else if ( document.documentElement.currentStyle ) {
7127
	getStyles = function( elem ) {
7128
		return elem.currentStyle;
7129
	};
7130
7131
	curCSS = function( elem, name, _computed ) {
7132
		var left, rs, rsLeft,
7133
			computed = _computed || getStyles( elem ),
7134
			ret = computed ? computed[ name ] : undefined,
7135
			style = elem.style;
7136
7137
		// Avoid setting ret to empty string here
7138
		// so we don't default to auto
7139
		if ( ret == null && style && style[ name ] ) {
7140
			ret = style[ name ];
7141
		}
7142
7143
		// From the awesome hack by Dean Edwards
7144
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
7145
7146
		// If we're not dealing with a regular pixel number
7147
		// but a number that has a weird ending, we need to convert it to pixels
7148
		// but not position css attributes, as those are proportional to the parent element instead
7149
		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
7150
		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
7151
7152
			// Remember the original values
7153
			left = style.left;
7154
			rs = elem.runtimeStyle;
7155
			rsLeft = rs && rs.left;
7156
7157
			// Put in the new values to get a computed value out
7158
			if ( rsLeft ) {
7159
				rs.left = elem.currentStyle.left;
7160
			}
7161
			style.left = name === "fontSize" ? "1em" : ret;
7162
			ret = style.pixelLeft + "px";
7163
7164
			// Revert the changed values
7165
			style.left = left;
7166
			if ( rsLeft ) {
7167
				rs.left = rsLeft;
7168
			}
7169
		}
7170
7171
		return ret === "" ? "auto" : ret;
7172
	};
7173
}
7174
7175
function setPositiveNumber( elem, value, subtract ) {
7176
	var matches = rnumsplit.exec( value );
7177
	return matches ?
7178
		// Guard against undefined "subtract", e.g., when used as in cssHooks
7179
		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
7180
		value;
7181
}
7182
7183
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
7184
	var i = extra === ( isBorderBox ? "border" : "content" ) ?
7185
		// If we already have the right measurement, avoid augmentation
7186
		4 :
7187
		// Otherwise initialize for horizontal or vertical properties
7188
		name === "width" ? 1 : 0,
7189
7190
		val = 0;
7191
7192
	for ( ; i < 4; i += 2 ) {
7193
		// both box models exclude margin, so add it if we want it
7194
		if ( extra === "margin" ) {
7195
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
7196
		}
7197
7198
		if ( isBorderBox ) {
7199
			// border-box includes padding, so remove it if we want content
7200
			if ( extra === "content" ) {
7201
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7202
			}
7203
7204
			// at this point, extra isn't border nor margin, so remove border
7205
			if ( extra !== "margin" ) {
7206
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7207
			}
7208
		} else {
7209
			// at this point, extra isn't content, so add padding
7210
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
7211
7212
			// at this point, extra isn't content nor padding, so add border
7213
			if ( extra !== "padding" ) {
7214
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
7215
			}
7216
		}
7217
	}
7218
7219
	return val;
7220
}
7221
7222
function getWidthOrHeight( elem, name, extra ) {
7223
7224
	// Start with offset property, which is equivalent to the border-box value
7225
	var valueIsBorderBox = true,
7226
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
7227
		styles = getStyles( elem ),
7228
		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
7229
7230
	// some non-html elements return undefined for offsetWidth, so check for null/undefined
7231
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
7232
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
7233
	if ( val <= 0 || val == null ) {
7234
		// Fall back to computed then uncomputed css if necessary
7235
		val = curCSS( elem, name, styles );
7236
		if ( val < 0 || val == null ) {
7237
			val = elem.style[ name ];
7238
		}
7239
7240
		// Computed unit is not pixels. Stop here and return.
7241
		if ( rnumnonpx.test(val) ) {
7242
			return val;
7243
		}
7244
7245
		// we need the check for style in case a browser which returns unreliable values
7246
		// for getComputedStyle silently falls back to the reliable elem.style
7247
		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
7248
7249
		// Normalize "", auto, and prepare for extra
7250
		val = parseFloat( val ) || 0;
7251
	}
7252
7253
	// use the active box-sizing model to add/subtract irrelevant styles
7254
	return ( val +
7255
		augmentWidthOrHeight(
7256
			elem,
7257
			name,
7258
			extra || ( isBorderBox ? "border" : "content" ),
7259
			valueIsBorderBox,
7260
			styles
7261
		)
7262
	) + "px";
7263
}
7264
7265
// Try to determine the default display value of an element
7266
function css_defaultDisplay( nodeName ) {
7267
	var doc = document,
7268
		display = elemdisplay[ nodeName ];
7269
7270
	if ( !display ) {
7271
		display = actualDisplay( nodeName, doc );
7272
7273
		// If the simple way fails, read from inside an iframe
7274
		if ( display === "none" || !display ) {
7275
			// Use the already-created iframe if possible
7276
			iframe = ( iframe ||
7277
				jQuery("<iframe frameborder='0' width='0' height='0'/>")
7278
				.css( "cssText", "display:block !important" )
7279
			).appendTo( doc.documentElement );
7280
7281
			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
7282
			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
7283
			doc.write("<!doctype html><html><body>");
7284
			doc.close();
7285
7286
			display = actualDisplay( nodeName, doc );
7287
			iframe.detach();
7288
		}
7289
7290
		// Store the correct default display
7291
		elemdisplay[ nodeName ] = display;
7292
	}
7293
7294
	return display;
7295
}
7296
7297
// Called ONLY from within css_defaultDisplay
7298
function actualDisplay( name, doc ) {
7299
	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
7300
		display = jQuery.css( elem[0], "display" );
7301
	elem.remove();
7302
	return display;
7303
}
7304
7305
jQuery.each([ "height", "width" ], function( i, name ) {
7306
	jQuery.cssHooks[ name ] = {
7307
		get: function( elem, computed, extra ) {
7308
			if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7309
				// certain elements can have dimension info if we invisibly show them
7310
				// however, it must have a current display style that would benefit from this
7311
				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
7312
					jQuery.swap( elem, cssShow, function() {
7313
						return getWidthOrHeight( elem, name, extra );
7314
					}) :
7315
					getWidthOrHeight( elem, name, extra );
7316
			}
7317
		},
7318
7319
		set: function( elem, value, extra ) {
7320
			var styles = extra && getStyles( elem );
7321
			return setPositiveNumber( elem, value, extra ?
7322
				augmentWidthOrHeight(
7323
					elem,
7324
					name,
7325
					extra,
7326
					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7327
					styles
7328
				) : 0
7329
			);
7330
		}
7331
	};
7332
});
7333
7334
if ( !jQuery.support.opacity ) {
7335
	jQuery.cssHooks.opacity = {
7336
		get: function( elem, computed ) {
7337
			// IE uses filters for opacity
7338
			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
7339
				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
7340
				computed ? "1" : "";
7341
		},
7342
7343
		set: function( elem, value ) {
7344
			var style = elem.style,
7345
				currentStyle = elem.currentStyle,
7346
				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7347
				filter = currentStyle && currentStyle.filter || style.filter || "";
7348
7349
			// IE has trouble with opacity if it does not have layout
7350
			// Force it by setting the zoom level
7351
			style.zoom = 1;
7352
7353
			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
7354
			// if value === "", then remove inline opacity #12685
7355
			if ( ( value >= 1 || value === "" ) &&
7356
					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
7357
					style.removeAttribute ) {
7358
7359
				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7360
				// if "filter:" is present at all, clearType is disabled, we want to avoid this
7361
				// style.removeAttribute is IE Only, but so apparently is this code path...
7362
				style.removeAttribute( "filter" );
7363
7364
				// if there is no filter style applied in a css rule or unset inline opacity, we are done
7365
				if ( value === "" || currentStyle && !currentStyle.filter ) {
7366
					return;
7367
				}
7368
			}
7369
7370
			// otherwise, set new filter values
7371
			style.filter = ralpha.test( filter ) ?
7372
				filter.replace( ralpha, opacity ) :
7373
				filter + " " + opacity;
7374
		}
7375
	};
7376
}
7377
7378
// These hooks cannot be added until DOM ready because the support test
7379
// for it is not run until after DOM ready
7380
jQuery(function() {
7381
	if ( !jQuery.support.reliableMarginRight ) {
7382
		jQuery.cssHooks.marginRight = {
7383
			get: function( elem, computed ) {
7384
				if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7385
					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
7386
					// Work around by temporarily setting element display to inline-block
7387
					return jQuery.swap( elem, { "display": "inline-block" },
7388
						curCSS, [ elem, "marginRight" ] );
0 ignored issues
show
Bug introduced by
The variable curCSS does not seem to be initialized in case document.documentElement.currentStyle on line 7126 is false. Are you sure the function swap handles undefined variables?
Loading history...
7389
				}
7390
			}
7391
		};
7392
	}
7393
7394
	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
7395
	// getComputedStyle returns percent when specified for top/left/bottom/right
7396
	// rather than make the css module depend on the offset module, we just check for it here
7397
	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
7398
		jQuery.each( [ "top", "left" ], function( i, prop ) {
7399
			jQuery.cssHooks[ prop ] = {
7400
				get: function( elem, computed ) {
7401
					if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7402
						computed = curCSS( elem, prop );
7403
						// if curCSS returns percentage, fallback to offset
7404
						return rnumnonpx.test( computed ) ?
7405
							jQuery( elem ).position()[ prop ] + "px" :
7406
							computed;
7407
					}
7408
				}
7409
			};
7410
		});
7411
	}
7412
7413
});
7414
7415
if ( jQuery.expr && jQuery.expr.filters ) {
7416
	jQuery.expr.filters.hidden = function( elem ) {
7417
		// Support: Opera <= 12.12
7418
		// Opera reports offsetWidths and offsetHeights less than zero on some elements
7419
		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
7420
			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
7421
	};
7422
7423
	jQuery.expr.filters.visible = function( elem ) {
7424
		return !jQuery.expr.filters.hidden( elem );
7425
	};
7426
}
7427
7428
// These hooks are used by animate to expand properties
7429
jQuery.each({
7430
	margin: "",
7431
	padding: "",
7432
	border: "Width"
7433
}, function( prefix, suffix ) {
7434
	jQuery.cssHooks[ prefix + suffix ] = {
7435
		expand: function( value ) {
7436
			var i = 0,
7437
				expanded = {},
7438
7439
				// assumes a single number if not a string
7440
				parts = typeof value === "string" ? value.split(" ") : [ value ];
7441
7442
			for ( ; i < 4; i++ ) {
7443
				expanded[ prefix + cssExpand[ i ] + suffix ] =
7444
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7445
			}
7446
7447
			return expanded;
7448
		}
7449
	};
7450
7451
	if ( !rmargin.test( prefix ) ) {
7452
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7453
	}
7454
});
7455
var r20 = /%20/g,
7456
	rbracket = /\[\]$/,
7457
	rCRLF = /\r?\n/g,
7458
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
7459
	rsubmittable = /^(?:input|select|textarea|keygen)/i;
7460
7461
jQuery.fn.extend({
7462
	serialize: function() {
7463
		return jQuery.param( this.serializeArray() );
7464
	},
7465
	serializeArray: function() {
7466
		return this.map(function(){
7467
			// Can add propHook for "elements" to filter or add form elements
7468
			var elements = jQuery.prop( this, "elements" );
7469
			return elements ? jQuery.makeArray( elements ) : this;
7470
		})
7471
		.filter(function(){
7472
			var type = this.type;
7473
			// Use .is(":disabled") so that fieldset[disabled] works
7474
			return this.name && !jQuery( this ).is( ":disabled" ) &&
7475
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
7476
				( this.checked || !manipulation_rcheckableType.test( type ) );
7477
		})
7478
		.map(function( i, elem ){
7479
			var val = jQuery( this ).val();
7480
7481
			return val == null ?
7482
				null :
7483
				jQuery.isArray( val ) ?
7484
					jQuery.map( val, function( val ){
7485
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7486
					}) :
7487
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7488
		}).get();
7489
	}
7490
});
7491
7492
//Serialize an array of form elements or a set of
7493
//key/values into a query string
7494
jQuery.param = function( a, traditional ) {
7495
	var prefix,
7496
		s = [],
7497
		add = function( key, value ) {
7498
			// If value is a function, invoke it and return its value
7499
			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
7500
			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7501
		};
7502
7503
	// Set traditional to true for jQuery <= 1.3.2 behavior.
7504
	if ( traditional === undefined ) {
7505
		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
7506
	}
7507
7508
	// If an array was passed in, assume that it is an array of form elements.
7509
	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7510
		// Serialize the form elements
7511
		jQuery.each( a, function() {
7512
			add( this.name, this.value );
7513
		});
7514
7515
	} else {
7516
		// If traditional, encode the "old" way (the way 1.3.2 or older
7517
		// did it), otherwise encode params recursively.
7518
		for ( prefix in a ) {
7519
			buildParams( prefix, a[ prefix ], traditional, add );
7520
		}
7521
	}
7522
7523
	// Return the resulting serialization
7524
	return s.join( "&" ).replace( r20, "+" );
7525
};
7526
7527
function buildParams( prefix, obj, traditional, add ) {
7528
	var name;
7529
7530
	if ( jQuery.isArray( obj ) ) {
7531
		// Serialize array item.
7532
		jQuery.each( obj, function( i, v ) {
7533
			if ( traditional || rbracket.test( prefix ) ) {
7534
				// Treat each array item as a scalar.
7535
				add( prefix, v );
7536
7537
			} else {
7538
				// Item is non-scalar (array or object), encode its numeric index.
7539
				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
7540
			}
7541
		});
7542
7543
	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
7544
		// Serialize object item.
7545
		for ( name in obj ) {
7546
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7547
		}
7548
7549
	} else {
7550
		// Serialize scalar item.
7551
		add( prefix, obj );
7552
	}
7553
}
7554
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7555
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7556
	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7557
7558
	// Handle event binding
7559
	jQuery.fn[ name ] = function( data, fn ) {
7560
		return arguments.length > 0 ?
7561
			this.on( name, null, data, fn ) :
7562
			this.trigger( name );
7563
	};
7564
});
7565
7566
jQuery.fn.extend({
7567
	hover: function( fnOver, fnOut ) {
7568
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7569
	},
7570
7571
	bind: function( types, data, fn ) {
7572
		return this.on( types, null, data, fn );
7573
	},
7574
	unbind: function( types, fn ) {
7575
		return this.off( types, null, fn );
7576
	},
7577
7578
	delegate: function( selector, types, data, fn ) {
7579
		return this.on( types, selector, data, fn );
7580
	},
7581
	undelegate: function( selector, types, fn ) {
7582
		// ( namespace ) or ( selector, types [, fn] )
7583
		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
7584
	}
7585
});
7586
var
7587
	// Document location
7588
	ajaxLocParts,
7589
	ajaxLocation,
7590
	ajax_nonce = jQuery.now(),
7591
7592
	ajax_rquery = /\?/,
7593
	rhash = /#.*$/,
7594
	rts = /([?&])_=[^&]*/,
7595
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
7596
	// #7653, #8125, #8152: local protocol detection
7597
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7598
	rnoContent = /^(?:GET|HEAD)$/,
7599
	rprotocol = /^\/\//,
7600
	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
7601
7602
	// Keep a copy of the old load method
7603
	_load = jQuery.fn.load,
7604
7605
	/* Prefilters
7606
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7607
	 * 2) These are called:
7608
	 *    - BEFORE asking for a transport
7609
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
7610
	 * 3) key is the dataType
7611
	 * 4) the catchall symbol "*" can be used
7612
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7613
	 */
7614
	prefilters = {},
7615
7616
	/* Transports bindings
7617
	 * 1) key is the dataType
7618
	 * 2) the catchall symbol "*" can be used
7619
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
7620
	 */
7621
	transports = {},
7622
7623
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7624
	allTypes = "*/".concat("*");
7625
7626
// #8138, IE may throw an exception when accessing
7627
// a field from window.location if document.domain has been set
7628
try {
7629
	ajaxLocation = location.href;
7630
} catch( e ) {
7631
	// Use the href attribute of an A element
7632
	// since IE will modify it given document.location
7633
	ajaxLocation = document.createElement( "a" );
7634
	ajaxLocation.href = "";
7635
	ajaxLocation = ajaxLocation.href;
7636
}
7637
7638
// Segment location into parts
7639
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7640
7641
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7642
function addToPrefiltersOrTransports( structure ) {
7643
7644
	// dataTypeExpression is optional and defaults to "*"
7645
	return function( dataTypeExpression, func ) {
7646
7647
		if ( typeof dataTypeExpression !== "string" ) {
7648
			func = dataTypeExpression;
7649
			dataTypeExpression = "*";
7650
		}
7651
7652
		var dataType,
7653
			i = 0,
7654
			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
7655
7656
		if ( jQuery.isFunction( func ) ) {
7657
			// For each dataType in the dataTypeExpression
7658
			while ( (dataType = dataTypes[i++]) ) {
7659
				// Prepend if requested
7660
				if ( dataType[0] === "+" ) {
7661
					dataType = dataType.slice( 1 ) || "*";
7662
					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7663
7664
				// Otherwise append
7665
				} else {
7666
					(structure[ dataType ] = structure[ dataType ] || []).push( func );
7667
				}
7668
			}
7669
		}
7670
	};
7671
}
7672
7673
// Base inspection function for prefilters and transports
7674
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7675
7676
	var inspected = {},
7677
		seekingTransport = ( structure === transports );
7678
7679
	function inspect( dataType ) {
7680
		var selected;
7681
		inspected[ dataType ] = true;
7682
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7683
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7684
			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7685
				options.dataTypes.unshift( dataTypeOrTransport );
7686
				inspect( dataTypeOrTransport );
7687
				return false;
7688
			} else if ( seekingTransport ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if seekingTransport is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7689
				return !( selected = dataTypeOrTransport );
7690
			}
7691
		});
7692
		return selected;
7693
	}
7694
7695
	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7696
}
7697
7698
// A special extend for ajax options
7699
// that takes "flat" options (not to be deep extended)
7700
// Fixes #9887
7701
function ajaxExtend( target, src ) {
7702
	var deep, key,
7703
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
7704
7705
	for ( key in src ) {
7706
		if ( src[ key ] !== undefined ) {
7707
			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7708
		}
7709
	}
7710
	if ( deep ) {
7711
		jQuery.extend( true, target, deep );
7712
	}
7713
7714
	return target;
7715
}
7716
7717
jQuery.fn.load = function( url, params, callback ) {
7718
	if ( typeof url !== "string" && _load ) {
7719
		return _load.apply( this, arguments );
7720
	}
7721
7722
	var selector, response, type,
7723
		self = this,
7724
		off = url.indexOf(" ");
7725
7726
	if ( off >= 0 ) {
7727
		selector = url.slice( off, url.length );
7728
		url = url.slice( 0, off );
7729
	}
7730
7731
	// If it's a function
7732
	if ( jQuery.isFunction( params ) ) {
7733
7734
		// We assume that it's the callback
7735
		callback = params;
7736
		params = undefined;
7737
7738
	// Otherwise, build a param string
7739
	} else if ( params && typeof params === "object" ) {
7740
		type = "POST";
7741
	}
7742
7743
	// If we have elements to modify, make the request
7744
	if ( self.length > 0 ) {
7745
		jQuery.ajax({
7746
			url: url,
7747
7748
			// if "type" variable is undefined, then "GET" method will be used
7749
			type: type,
0 ignored issues
show
Bug introduced by
The variable type seems to not be initialized for all possible execution paths.
Loading history...
7750
			dataType: "html",
7751
			data: params
7752
		}).done(function( responseText ) {
7753
7754
			// Save response for use in complete callback
7755
			response = arguments;
7756
7757
			self.html( selector ?
7758
7759
				// If a selector was specified, locate the right elements in a dummy div
7760
				// Exclude scripts to avoid IE 'Permission Denied' errors
7761
				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
7762
7763
				// Otherwise use the full result
7764
				responseText );
7765
7766
		}).complete( callback && function( jqXHR, status ) {
7767
			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
7768
		});
7769
	}
7770
7771
	return this;
7772
};
7773
7774
// Attach a bunch of functions for handling common AJAX events
7775
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
7776
	jQuery.fn[ type ] = function( fn ){
7777
		return this.on( type, fn );
7778
	};
7779
});
7780
7781
jQuery.extend({
7782
7783
	// Counter for holding the number of active queries
7784
	active: 0,
7785
7786
	// Last-Modified header cache for next request
7787
	lastModified: {},
7788
	etag: {},
7789
7790
	ajaxSettings: {
7791
		url: ajaxLocation,
7792
		type: "GET",
7793
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7794
		global: true,
7795
		processData: true,
7796
		async: true,
7797
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7798
		/*
7799
		timeout: 0,
7800
		data: null,
7801
		dataType: null,
7802
		username: null,
7803
		password: null,
7804
		cache: null,
7805
		throws: false,
7806
		traditional: false,
7807
		headers: {},
7808
		*/
7809
7810
		accepts: {
7811
			"*": allTypes,
7812
			text: "text/plain",
7813
			html: "text/html",
7814
			xml: "application/xml, text/xml",
7815
			json: "application/json, text/javascript"
7816
		},
7817
7818
		contents: {
7819
			xml: /xml/,
7820
			html: /html/,
7821
			json: /json/
7822
		},
7823
7824
		responseFields: {
7825
			xml: "responseXML",
7826
			text: "responseText",
7827
			json: "responseJSON"
7828
		},
7829
7830
		// Data converters
7831
		// Keys separate source (or catchall "*") and destination types with a single space
7832
		converters: {
7833
7834
			// Convert anything to text
7835
			"* text": String,
7836
7837
			// Text to html (true = no transformation)
7838
			"text html": true,
7839
7840
			// Evaluate text as a json expression
7841
			"text json": jQuery.parseJSON,
7842
7843
			// Parse text as xml
7844
			"text xml": jQuery.parseXML
7845
		},
7846
7847
		// For options that shouldn't be deep extended:
7848
		// you can add your own custom options here if
7849
		// and when you create one that shouldn't be
7850
		// deep extended (see ajaxExtend)
7851
		flatOptions: {
7852
			url: true,
7853
			context: true
7854
		}
7855
	},
7856
7857
	// Creates a full fledged settings object into target
7858
	// with both ajaxSettings and settings fields.
7859
	// If target is omitted, writes into ajaxSettings.
7860
	ajaxSetup: function( target, settings ) {
7861
		return settings ?
7862
7863
			// Building a settings object
7864
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7865
7866
			// Extending ajaxSettings
7867
			ajaxExtend( jQuery.ajaxSettings, target );
7868
	},
7869
7870
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7871
	ajaxTransport: addToPrefiltersOrTransports( transports ),
7872
7873
	// Main method
7874
	ajax: function( url, options ) {
7875
7876
		// If url is an object, simulate pre-1.5 signature
7877
		if ( typeof url === "object" ) {
7878
			options = url;
7879
			url = undefined;
7880
		}
7881
7882
		// Force options to be an object
7883
		options = options || {};
7884
7885
		var // Cross-domain detection vars
7886
			parts,
7887
			// Loop variable
7888
			i,
7889
			// URL without anti-cache param
7890
			cacheURL,
7891
			// Response headers as string
7892
			responseHeadersString,
7893
			// timeout handle
7894
			timeoutTimer,
7895
7896
			// To know if global events are to be dispatched
7897
			fireGlobals,
7898
7899
			transport,
7900
			// Response headers
7901
			responseHeaders,
7902
			// Create the final options object
7903
			s = jQuery.ajaxSetup( {}, options ),
7904
			// Callbacks context
7905
			callbackContext = s.context || s,
7906
			// Context for global events is callbackContext if it is a DOM node or jQuery collection
7907
			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7908
				jQuery( callbackContext ) :
7909
				jQuery.event,
7910
			// Deferreds
7911
			deferred = jQuery.Deferred(),
7912
			completeDeferred = jQuery.Callbacks("once memory"),
7913
			// Status-dependent callbacks
7914
			statusCode = s.statusCode || {},
7915
			// Headers (they are sent all at once)
7916
			requestHeaders = {},
7917
			requestHeadersNames = {},
7918
			// The jqXHR state
7919
			state = 0,
7920
			// Default abort message
7921
			strAbort = "canceled",
7922
			// Fake xhr
7923
			jqXHR = {
7924
				readyState: 0,
7925
7926
				// Builds headers hashtable if needed
7927
				getResponseHeader: function( key ) {
7928
					var match;
7929
					if ( state === 2 ) {
7930
						if ( !responseHeaders ) {
7931
							responseHeaders = {};
7932
							while ( (match = rheaders.exec( responseHeadersString )) ) {
7933
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7934
							}
7935
						}
7936
						match = responseHeaders[ key.toLowerCase() ];
7937
					}
7938
					return match == null ? null : match;
0 ignored issues
show
Bug introduced by
The variable match does not seem to be initialized in case state === 2 on line 7929 is false. Are you sure this can never be the case?
Loading history...
7939
				},
7940
7941
				// Raw string
7942
				getAllResponseHeaders: function() {
7943
					return state === 2 ? responseHeadersString : null;
7944
				},
7945
7946
				// Caches the header
7947
				setRequestHeader: function( name, value ) {
7948
					var lname = name.toLowerCase();
7949
					if ( !state ) {
7950
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7951
						requestHeaders[ name ] = value;
7952
					}
7953
					return this;
7954
				},
7955
7956
				// Overrides response content-type header
7957
				overrideMimeType: function( type ) {
7958
					if ( !state ) {
7959
						s.mimeType = type;
7960
					}
7961
					return this;
7962
				},
7963
7964
				// Status-dependent callbacks
7965
				statusCode: function( map ) {
7966
					var code;
7967
					if ( map ) {
7968
						if ( state < 2 ) {
7969
							for ( code in map ) {
7970
								// Lazy-add the new callback in a way that preserves old ones
7971
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7972
							}
7973
						} else {
7974
							// Execute the appropriate callbacks
7975
							jqXHR.always( map[ jqXHR.status ] );
7976
						}
7977
					}
7978
					return this;
7979
				},
7980
7981
				// Cancel the request
7982
				abort: function( statusText ) {
7983
					var finalText = statusText || strAbort;
7984
					if ( transport ) {
7985
						transport.abort( finalText );
7986
					}
7987
					done( 0, finalText );
7988
					return this;
7989
				}
7990
			};
7991
7992
		// Attach deferreds
7993
		deferred.promise( jqXHR ).complete = completeDeferred.add;
7994
		jqXHR.success = jqXHR.done;
7995
		jqXHR.error = jqXHR.fail;
7996
7997
		// Remove hash character (#7531: and string promotion)
7998
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7999
		// Handle falsy url in the settings object (#10093: consistency with old signature)
8000
		// We also use the url parameter if available
8001
		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
8002
8003
		// Alias method option to type as per ticket #12004
8004
		s.type = options.method || options.type || s.method || s.type;
8005
8006
		// Extract dataTypes list
8007
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
8008
8009
		// A cross-domain request is in order when we have a protocol:host:port mismatch
8010
		if ( s.crossDomain == null ) {
8011
			parts = rurl.exec( s.url.toLowerCase() );
8012
			s.crossDomain = !!( parts &&
8013
				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
8014
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
8015
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
8016
			);
8017
		}
8018
8019
		// Convert data if not already a string
8020
		if ( s.data && s.processData && typeof s.data !== "string" ) {
8021
			s.data = jQuery.param( s.data, s.traditional );
8022
		}
8023
8024
		// Apply prefilters
8025
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
8026
8027
		// If request was aborted inside a prefilter, stop there
8028
		if ( state === 2 ) {
8029
			return jqXHR;
8030
		}
8031
8032
		// We can fire global events as of now if asked to
8033
		fireGlobals = s.global;
8034
8035
		// Watch for a new set of requests
8036
		if ( fireGlobals && jQuery.active++ === 0 ) {
8037
			jQuery.event.trigger("ajaxStart");
8038
		}
8039
8040
		// Uppercase the type
8041
		s.type = s.type.toUpperCase();
8042
8043
		// Determine if request has content
8044
		s.hasContent = !rnoContent.test( s.type );
8045
8046
		// Save the URL in case we're toying with the If-Modified-Since
8047
		// and/or If-None-Match header later on
8048
		cacheURL = s.url;
8049
8050
		// More options handling for requests with no content
8051
		if ( !s.hasContent ) {
8052
8053
			// If data is available, append data to url
8054
			if ( s.data ) {
8055
				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
8056
				// #9682: remove data so that it's not used in an eventual retry
8057
				delete s.data;
8058
			}
8059
8060
			// Add anti-cache in url if needed
8061
			if ( s.cache === false ) {
8062
				s.url = rts.test( cacheURL ) ?
8063
8064
					// If there is already a '_' parameter, set its value
8065
					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
8066
8067
					// Otherwise add one to the end
8068
					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
8069
			}
8070
		}
8071
8072
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8073
		if ( s.ifModified ) {
8074
			if ( jQuery.lastModified[ cacheURL ] ) {
8075
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
8076
			}
8077
			if ( jQuery.etag[ cacheURL ] ) {
8078
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
8079
			}
8080
		}
8081
8082
		// Set the correct header, if data is being sent
8083
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
8084
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
8085
		}
8086
8087
		// Set the Accepts header for the server, depending on the dataType
8088
		jqXHR.setRequestHeader(
8089
			"Accept",
8090
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
8091
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
8092
				s.accepts[ "*" ]
8093
		);
8094
8095
		// Check for headers option
8096
		for ( i in s.headers ) {
8097
			jqXHR.setRequestHeader( i, s.headers[ i ] );
8098
		}
8099
8100
		// Allow custom headers/mimetypes and early abort
8101
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
8102
			// Abort if not done already and return
8103
			return jqXHR.abort();
8104
		}
8105
8106
		// aborting is no longer a cancellation
8107
		strAbort = "abort";
8108
8109
		// Install callbacks on deferreds
8110
		for ( i in { success: 1, error: 1, complete: 1 } ) {
8111
			jqXHR[ i ]( s[ i ] );
8112
		}
8113
8114
		// Get transport
8115
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
8116
8117
		// If no transport, we auto-abort
8118
		if ( !transport ) {
8119
			done( -1, "No Transport" );
8120
		} else {
8121
			jqXHR.readyState = 1;
8122
8123
			// Send global event
8124
			if ( fireGlobals ) {
8125
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
8126
			}
8127
			// Timeout
8128
			if ( s.async && s.timeout > 0 ) {
8129
				timeoutTimer = setTimeout(function() {
8130
					jqXHR.abort("timeout");
8131
				}, s.timeout );
8132
			}
8133
8134
			try {
8135
				state = 1;
8136
				transport.send( requestHeaders, done );
8137
			} catch ( e ) {
8138
				// Propagate exception as error if not done
8139
				if ( state < 2 ) {
8140
					done( -1, e );
8141
				// Simply rethrow otherwise
8142
				} else {
8143
					throw e;
8144
				}
8145
			}
8146
		}
8147
8148
		// Callback for when everything is done
8149
		function done( status, nativeStatusText, responses, headers ) {
8150
			var isSuccess, success, error, response, modified,
8151
				statusText = nativeStatusText;
8152
8153
			// Called once
8154
			if ( state === 2 ) {
8155
				return;
8156
			}
8157
8158
			// State is "done" now
8159
			state = 2;
8160
8161
			// Clear timeout if it exists
8162
			if ( timeoutTimer ) {
8163
				clearTimeout( timeoutTimer );
8164
			}
8165
8166
			// Dereference transport for early garbage collection
8167
			// (no matter how long the jqXHR object will be used)
8168
			transport = undefined;
8169
8170
			// Cache response headers
8171
			responseHeadersString = headers || "";
8172
8173
			// Set readyState
8174
			jqXHR.readyState = status > 0 ? 4 : 0;
8175
8176
			// Determine if successful
8177
			isSuccess = status >= 200 && status < 300 || status === 304;
8178
8179
			// Get response data
8180
			if ( responses ) {
8181
				response = ajaxHandleResponses( s, jqXHR, responses );
8182
			}
8183
8184
			// Convert no matter what (that way responseXXX fields are always set)
8185
			response = ajaxConvert( s, response, jqXHR, isSuccess );
0 ignored issues
show
Bug introduced by
The variable response does not seem to be initialized in case responses on line 8180 is false. Are you sure the function ajaxConvert handles undefined variables?
Loading history...
8186
8187
			// If successful, handle type chaining
8188
			if ( isSuccess ) {
8189
8190
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8191
				if ( s.ifModified ) {
8192
					modified = jqXHR.getResponseHeader("Last-Modified");
8193
					if ( modified ) {
8194
						jQuery.lastModified[ cacheURL ] = modified;
8195
					}
8196
					modified = jqXHR.getResponseHeader("etag");
8197
					if ( modified ) {
8198
						jQuery.etag[ cacheURL ] = modified;
8199
					}
8200
				}
8201
8202
				// if no content
8203
				if ( status === 204 || s.type === "HEAD" ) {
8204
					statusText = "nocontent";
8205
8206
				// if not modified
8207
				} else if ( status === 304 ) {
8208
					statusText = "notmodified";
8209
8210
				// If we have data, let's convert it
8211
				} else {
8212
					statusText = response.state;
8213
					success = response.data;
8214
					error = response.error;
8215
					isSuccess = !error;
8216
				}
8217
			} else {
8218
				// We extract error from statusText
8219
				// then normalize statusText and status for non-aborts
8220
				error = statusText;
8221
				if ( status || !statusText ) {
8222
					statusText = "error";
8223
					if ( status < 0 ) {
8224
						status = 0;
8225
					}
8226
				}
8227
			}
8228
8229
			// Set data for the fake xhr object
8230
			jqXHR.status = status;
8231
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
8232
8233
			// Success/Error
8234
			if ( isSuccess ) {
8235
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
0 ignored issues
show
Bug introduced by
The variable success seems to not be initialized for all possible execution paths.
Loading history...
8236
			} else {
8237
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
0 ignored issues
show
Bug introduced by
The variable error seems to not be initialized for all possible execution paths.
Loading history...
8238
			}
8239
8240
			// Status-dependent callbacks
8241
			jqXHR.statusCode( statusCode );
8242
			statusCode = undefined;
8243
8244
			if ( fireGlobals ) {
8245
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
8246
					[ jqXHR, s, isSuccess ? success : error ] );
8247
			}
8248
8249
			// Complete
8250
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8251
8252
			if ( fireGlobals ) {
8253
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
8254
				// Handle the global AJAX counter
8255
				if ( !( --jQuery.active ) ) {
8256
					jQuery.event.trigger("ajaxStop");
8257
				}
8258
			}
8259
		}
8260
8261
		return jqXHR;
8262
	},
8263
8264
	getJSON: function( url, data, callback ) {
8265
		return jQuery.get( url, data, callback, "json" );
8266
	},
8267
8268
	getScript: function( url, callback ) {
8269
		return jQuery.get( url, undefined, callback, "script" );
8270
	}
8271
});
8272
8273
jQuery.each( [ "get", "post" ], function( i, method ) {
8274
	jQuery[ method ] = function( url, data, callback, type ) {
8275
		// shift arguments if data argument was omitted
8276
		if ( jQuery.isFunction( data ) ) {
8277
			type = type || callback;
8278
			callback = data;
8279
			data = undefined;
8280
		}
8281
8282
		return jQuery.ajax({
8283
			url: url,
8284
			type: method,
8285
			dataType: type,
8286
			data: data,
8287
			success: callback
8288
		});
8289
	};
8290
});
8291
8292
/* Handles responses to an ajax request:
8293
 * - finds the right dataType (mediates between content-type and expected dataType)
8294
 * - returns the corresponding response
8295
 */
8296
function ajaxHandleResponses( s, jqXHR, responses ) {
8297
	var firstDataType, ct, finalDataType, type,
8298
		contents = s.contents,
8299
		dataTypes = s.dataTypes;
8300
8301
	// Remove auto dataType and get content-type in the process
8302
	while( dataTypes[ 0 ] === "*" ) {
8303
		dataTypes.shift();
8304
		if ( ct === undefined ) {
0 ignored issues
show
Bug introduced by
The variable ct seems to not be initialized for all possible execution paths.
Loading history...
8305
			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8306
		}
8307
	}
8308
8309
	// Check if we're dealing with a known content-type
8310
	if ( ct ) {
8311
		for ( type in contents ) {
8312
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8313
				dataTypes.unshift( type );
8314
				break;
8315
			}
8316
		}
8317
	}
8318
8319
	// Check to see if we have a response for the expected dataType
8320
	if ( dataTypes[ 0 ] in responses ) {
8321
		finalDataType = dataTypes[ 0 ];
8322
	} else {
8323
		// Try convertible dataTypes
8324
		for ( type in responses ) {
8325
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8326
				finalDataType = type;
8327
				break;
8328
			}
8329
			if ( !firstDataType ) {
8330
				firstDataType = type;
8331
			}
8332
		}
8333
		// Or just use first one
8334
		finalDataType = finalDataType || firstDataType;
8335
	}
8336
8337
	// If we found a dataType
8338
	// We add the dataType to the list if needed
8339
	// and return the corresponding response
8340
	if ( finalDataType ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if finalDataType is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8341
		if ( finalDataType !== dataTypes[ 0 ] ) {
8342
			dataTypes.unshift( finalDataType );
8343
		}
8344
		return responses[ finalDataType ];
8345
	}
8346
}
8347
8348
/* Chain conversions given the request and the original response
8349
 * Also sets the responseXXX fields on the jqXHR instance
8350
 */
8351
function ajaxConvert( s, response, jqXHR, isSuccess ) {
8352
	var conv2, current, conv, tmp, prev,
8353
		converters = {},
8354
		// Work with a copy of dataTypes in case we need to modify it for conversion
8355
		dataTypes = s.dataTypes.slice();
8356
8357
	// Create converters map with lowercased keys
8358
	if ( dataTypes[ 1 ] ) {
8359
		for ( conv in s.converters ) {
8360
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8361
		}
8362
	}
8363
8364
	current = dataTypes.shift();
8365
8366
	// Convert to each sequential dataType
8367
	while ( current ) {
8368
8369
		if ( s.responseFields[ current ] ) {
8370
			jqXHR[ s.responseFields[ current ] ] = response;
8371
		}
8372
8373
		// Apply the dataFilter if provided
8374
		if ( !prev && isSuccess && s.dataFilter ) {
8375
			response = s.dataFilter( response, s.dataType );
8376
		}
8377
8378
		prev = current;
8379
		current = dataTypes.shift();
8380
8381
		if ( current ) {
8382
8383
			// There's only work to do if current dataType is non-auto
8384
			if ( current === "*" ) {
8385
8386
				current = prev;
8387
8388
			// Convert response if prev dataType is non-auto and differs from current
8389
			} else if ( prev !== "*" && prev !== current ) {
8390
8391
				// Seek a direct converter
8392
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8393
8394
				// If none found, seek a pair
8395
				if ( !conv ) {
8396
					for ( conv2 in converters ) {
8397
8398
						// If conv2 outputs current
8399
						tmp = conv2.split( " " );
8400
						if ( tmp[ 1 ] === current ) {
8401
8402
							// If prev can be converted to accepted input
8403
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
8404
								converters[ "* " + tmp[ 0 ] ];
8405
							if ( conv ) {
8406
								// Condense equivalence converters
8407
								if ( conv === true ) {
8408
									conv = converters[ conv2 ];
8409
8410
								// Otherwise, insert the intermediate dataType
8411
								} else if ( converters[ conv2 ] !== true ) {
8412
									current = tmp[ 0 ];
8413
									dataTypes.unshift( tmp[ 1 ] );
8414
								}
8415
								break;
8416
							}
8417
						}
8418
					}
8419
				}
8420
8421
				// Apply converter (if not an equivalence)
8422
				if ( conv !== true ) {
8423
8424
					// Unless errors are allowed to bubble, catch and return them
8425
					if ( conv && s[ "throws" ] ) {
8426
						response = conv( response );
8427
					} else {
8428
						try {
8429
							response = conv( response );
8430
						} catch ( e ) {
8431
							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8432
						}
8433
					}
8434
				}
8435
			}
8436
		}
8437
	}
8438
8439
	return { state: "success", data: response };
8440
}
8441
// Install script dataType
8442
jQuery.ajaxSetup({
8443
	accepts: {
8444
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8445
	},
8446
	contents: {
8447
		script: /(?:java|ecma)script/
8448
	},
8449
	converters: {
8450
		"text script": function( text ) {
8451
			jQuery.globalEval( text );
8452
			return text;
8453
		}
8454
	}
8455
});
8456
8457
// Handle cache's special case and global
8458
jQuery.ajaxPrefilter( "script", function( s ) {
8459
	if ( s.cache === undefined ) {
8460
		s.cache = false;
8461
	}
8462
	if ( s.crossDomain ) {
8463
		s.type = "GET";
8464
		s.global = false;
8465
	}
8466
});
8467
8468
// Bind script tag hack transport
8469
jQuery.ajaxTransport( "script", function(s) {
8470
8471
	// This transport only deals with cross domain requests
8472
	if ( s.crossDomain ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if s.crossDomain is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8473
8474
		var script,
8475
			head = document.head || jQuery("head")[0] || document.documentElement;
8476
8477
		return {
8478
8479
			send: function( _, callback ) {
8480
8481
				script = document.createElement("script");
8482
8483
				script.async = true;
8484
8485
				if ( s.scriptCharset ) {
8486
					script.charset = s.scriptCharset;
8487
				}
8488
8489
				script.src = s.url;
8490
8491
				// Attach handlers for all browsers
8492
				script.onload = script.onreadystatechange = function( _, isAbort ) {
8493
8494
					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8495
8496
						// Handle memory leak in IE
8497
						script.onload = script.onreadystatechange = null;
8498
8499
						// Remove the script
8500
						if ( script.parentNode ) {
8501
							script.parentNode.removeChild( script );
8502
						}
8503
8504
						// Dereference the script
8505
						script = null;
8506
8507
						// Callback if not abort
8508
						if ( !isAbort ) {
8509
							callback( 200, "success" );
8510
						}
8511
					}
8512
				};
8513
8514
				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
8515
				// Use native DOM manipulation to avoid our domManip AJAX trickery
8516
				head.insertBefore( script, head.firstChild );
8517
			},
8518
8519
			abort: function() {
8520
				if ( script ) {
8521
					script.onload( undefined, true );
8522
				}
8523
			}
8524
		};
8525
	}
8526
});
8527
var oldCallbacks = [],
8528
	rjsonp = /(=)\?(?=&|$)|\?\?/;
8529
8530
// Default jsonp settings
8531
jQuery.ajaxSetup({
8532
	jsonp: "callback",
8533
	jsonpCallback: function() {
8534
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
8535
		this[ callback ] = true;
8536
		return callback;
8537
	}
8538
});
8539
8540
// Detect, normalize options and install callbacks for jsonp requests
8541
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8542
8543
	var callbackName, overwritten, responseContainer,
8544
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
8545
			"url" :
8546
			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8547
		);
8548
8549
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
8550
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jsonProp || s.dataTypes.0 === "jsonp" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8551
8552
		// Get callback name, remembering preexisting value associated with it
8553
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8554
			s.jsonpCallback() :
8555
			s.jsonpCallback;
8556
8557
		// Insert callback into url or form data
8558
		if ( jsonProp ) {
8559
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
8560
		} else if ( s.jsonp !== false ) {
8561
			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
8562
		}
8563
8564
		// Use data converter to retrieve json after script execution
8565
		s.converters["script json"] = function() {
8566
			if ( !responseContainer ) {
8567
				jQuery.error( callbackName + " was not called" );
8568
			}
8569
			return responseContainer[ 0 ];
0 ignored issues
show
Bug introduced by
The variable responseContainer seems to not be initialized for all possible execution paths.
Loading history...
8570
		};
8571
8572
		// force json dataType
8573
		s.dataTypes[ 0 ] = "json";
8574
8575
		// Install callback
8576
		overwritten = window[ callbackName ];
8577
		window[ callbackName ] = function() {
8578
			responseContainer = arguments;
8579
		};
8580
8581
		// Clean-up function (fires after converters)
8582
		jqXHR.always(function() {
8583
			// Restore preexisting value
8584
			window[ callbackName ] = overwritten;
8585
8586
			// Save back as free
8587
			if ( s[ callbackName ] ) {
8588
				// make sure that re-using the options doesn't screw things around
8589
				s.jsonpCallback = originalSettings.jsonpCallback;
8590
8591
				// save the callback name for future use
8592
				oldCallbacks.push( callbackName );
8593
			}
8594
8595
			// Call if it was a function and we have a response
8596
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8597
				overwritten( responseContainer[ 0 ] );
8598
			}
8599
8600
			responseContainer = overwritten = undefined;
8601
		});
8602
8603
		// Delegate to script
8604
		return "script";
8605
	}
8606
});
8607
var xhrCallbacks, xhrSupported,
8608
	xhrId = 0,
8609
	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
8610
	xhrOnUnloadAbort = window.ActiveXObject && function() {
8611
		// Abort all pending requests
8612
		var key;
8613
		for ( key in xhrCallbacks ) {
8614
			xhrCallbacks[ key ]( undefined, true );
8615
		}
8616
	};
8617
8618
// Functions to create xhrs
8619
function createStandardXHR() {
8620
	try {
8621
		return new window.XMLHttpRequest();
8622
	} catch( e ) {}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8623
}
8624
8625
function createActiveXHR() {
8626
	try {
8627
		return new window.ActiveXObject("Microsoft.XMLHTTP");
8628
	} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
8629
}
8630
8631
// Create the request object
8632
// (This is still attached to ajaxSettings for backward compatibility)
8633
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8634
	/* Microsoft failed to properly
8635
	 * implement the XMLHttpRequest in IE7 (can't request local files),
8636
	 * so we use the ActiveXObject when it is available
8637
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8638
	 * we need a fallback.
8639
	 */
8640
	function() {
8641
		return !this.isLocal && createStandardXHR() || createActiveXHR();
8642
	} :
8643
	// For all other browsers, use the standard XMLHttpRequest object
8644
	createStandardXHR;
8645
8646
// Determine support properties
8647
xhrSupported = jQuery.ajaxSettings.xhr();
8648
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
8649
xhrSupported = jQuery.support.ajax = !!xhrSupported;
8650
8651
// Create transport if the browser can provide an xhr
8652
if ( xhrSupported ) {
8653
8654
	jQuery.ajaxTransport(function( s ) {
8655
		// Cross domain only allowed if supported through XMLHttpRequest
8656
		if ( !s.crossDomain || jQuery.support.cors ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !s.crossDomain || jQuery.support.cors is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8657
8658
			var callback;
8659
8660
			return {
8661
				send: function( headers, complete ) {
8662
8663
					// Get a new xhr
8664
					var handle, i,
8665
						xhr = s.xhr();
8666
8667
					// Open the socket
8668
					// Passing null username, generates a login popup on Opera (#2865)
8669
					if ( s.username ) {
8670
						xhr.open( s.type, s.url, s.async, s.username, s.password );
8671
					} else {
8672
						xhr.open( s.type, s.url, s.async );
8673
					}
8674
8675
					// Apply custom fields if provided
8676
					if ( s.xhrFields ) {
8677
						for ( i in s.xhrFields ) {
8678
							xhr[ i ] = s.xhrFields[ i ];
8679
						}
8680
					}
8681
8682
					// Override mime type if needed
8683
					if ( s.mimeType && xhr.overrideMimeType ) {
8684
						xhr.overrideMimeType( s.mimeType );
8685
					}
8686
8687
					// X-Requested-With header
8688
					// For cross-domain requests, seeing as conditions for a preflight are
8689
					// akin to a jigsaw puzzle, we simply never set it to be sure.
8690
					// (it can always be set on a per-request basis or even using ajaxSetup)
8691
					// For same-domain requests, won't change header if already provided.
8692
					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8693
						headers["X-Requested-With"] = "XMLHttpRequest";
8694
					}
8695
8696
					// Need an extra try/catch for cross domain requests in Firefox 3
8697
					try {
8698
						for ( i in headers ) {
8699
							xhr.setRequestHeader( i, headers[ i ] );
8700
						}
8701
					} catch( err ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8702
8703
					// Do send the request
8704
					// This may raise an exception which is actually
8705
					// handled in jQuery.ajax (so no try/catch here)
8706
					xhr.send( ( s.hasContent && s.data ) || null );
8707
8708
					// Listener
8709
					callback = function( _, isAbort ) {
8710
						var status, responseHeaders, statusText, responses;
8711
8712
						// Firefox throws exceptions when accessing properties
8713
						// of an xhr when a network error occurred
8714
						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8715
						try {
8716
8717
							// Was never called and is aborted or complete
8718
							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8719
8720
								// Only called once
8721
								callback = undefined;
8722
8723
								// Do not keep as active anymore
8724
								if ( handle ) {
8725
									xhr.onreadystatechange = jQuery.noop;
8726
									if ( xhrOnUnloadAbort ) {
8727
										delete xhrCallbacks[ handle ];
8728
									}
8729
								}
8730
8731
								// If it's an abort
8732
								if ( isAbort ) {
8733
									// Abort it manually if needed
8734
									if ( xhr.readyState !== 4 ) {
8735
										xhr.abort();
8736
									}
8737
								} else {
8738
									responses = {};
8739
									status = xhr.status;
8740
									responseHeaders = xhr.getAllResponseHeaders();
8741
8742
									// When requesting binary data, IE6-9 will throw an exception
8743
									// on any attempt to access responseText (#11426)
8744
									if ( typeof xhr.responseText === "string" ) {
8745
										responses.text = xhr.responseText;
8746
									}
8747
8748
									// Firefox throws an exception when accessing
8749
									// statusText for faulty cross-domain requests
8750
									try {
8751
										statusText = xhr.statusText;
8752
									} catch( e ) {
8753
										// We normalize with Webkit giving an empty statusText
8754
										statusText = "";
8755
									}
8756
8757
									// Filter status for non standard behaviors
8758
8759
									// If the request is local and we have data: assume a success
8760
									// (success with no data won't get notified, that's the best we
8761
									// can do given current implementations)
8762
									if ( !status && s.isLocal && !s.crossDomain ) {
8763
										status = responses.text ? 200 : 404;
8764
									// IE - #1450: sometimes returns 1223 when it should be 204
8765
									} else if ( status === 1223 ) {
8766
										status = 204;
8767
									}
8768
								}
8769
							}
8770
						} catch( firefoxAccessException ) {
8771
							if ( !isAbort ) {
8772
								complete( -1, firefoxAccessException );
8773
							}
8774
						}
8775
8776
						// Call complete if needed
8777
						if ( responses ) {
8778
							complete( status, statusText, responses, responseHeaders );
0 ignored issues
show
Bug introduced by
The variable status seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
Bug introduced by
The variable responseHeaders seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
Bug introduced by
The variable statusText seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
8779
						}
8780
					};
8781
8782
					if ( !s.async ) {
8783
						// if we're in sync mode we fire the callback
8784
						callback();
8785
					} else if ( xhr.readyState === 4 ) {
8786
						// (IE6 & IE7) if it's in cache and has been
8787
						// retrieved directly we need to fire the callback
8788
						setTimeout( callback );
8789
					} else {
8790
						handle = ++xhrId;
8791
						if ( xhrOnUnloadAbort ) {
8792
							// Create the active xhrs callbacks list if needed
8793
							// and attach the unload handler
8794
							if ( !xhrCallbacks ) {
8795
								xhrCallbacks = {};
8796
								jQuery( window ).unload( xhrOnUnloadAbort );
8797
							}
8798
							// Add to list of active xhrs callbacks
8799
							xhrCallbacks[ handle ] = callback;
8800
						}
8801
						xhr.onreadystatechange = callback;
8802
					}
8803
				},
8804
8805
				abort: function() {
8806
					if ( callback ) {
8807
						callback( undefined, true );
8808
					}
8809
				}
8810
			};
8811
		}
8812
	});
8813
}
8814
var fxNow, timerId,
8815
	rfxtypes = /^(?:toggle|show|hide)$/,
8816
	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
8817
	rrun = /queueHooks$/,
8818
	animationPrefilters = [ defaultPrefilter ],
8819
	tweeners = {
8820
		"*": [function( prop, value ) {
8821
			var tween = this.createTween( prop, value ),
8822
				target = tween.cur(),
8823
				parts = rfxnum.exec( value ),
8824
				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
8825
8826
				// Starting value computation is required for potential unit mismatches
8827
				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
8828
					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
8829
				scale = 1,
8830
				maxIterations = 20;
8831
8832
			if ( start && start[ 3 ] !== unit ) {
8833
				// Trust units reported by jQuery.css
8834
				unit = unit || start[ 3 ];
8835
8836
				// Make sure we update the tween properties later on
8837
				parts = parts || [];
8838
8839
				// Iteratively approximate from a nonzero starting point
8840
				start = +target || 1;
8841
8842
				do {
8843
					// If previous iteration zeroed out, double until we get *something*
8844
					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
8845
					scale = scale || ".5";
8846
8847
					// Adjust and apply
8848
					start = start / scale;
8849
					jQuery.style( tween.elem, prop, start + unit );
8850
8851
				// Update scale, tolerating zero or NaN from tween.cur()
8852
				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
8853
				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
8854
			}
8855
8856
			// Update tween properties
8857
			if ( parts ) {
8858
				start = tween.start = +start || +target || 0;
8859
				tween.unit = unit;
8860
				// If a +=/-= token was provided, we're doing a relative animation
8861
				tween.end = parts[ 1 ] ?
8862
					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
8863
					+parts[ 2 ];
8864
			}
8865
8866
			return tween;
8867
		}]
8868
	};
8869
8870
// Animations created synchronously will run synchronously
8871
function createFxNow() {
8872
	setTimeout(function() {
8873
		fxNow = undefined;
8874
	});
8875
	return ( fxNow = jQuery.now() );
8876
}
8877
8878
function createTween( value, prop, animation ) {
8879
	var tween,
8880
		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
8881
		index = 0,
8882
		length = collection.length;
8883
	for ( ; index < length; index++ ) {
8884
		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
8885
8886
			// we're done with this property
8887
			return tween;
8888
		}
8889
	}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
8890
}
8891
8892
function Animation( elem, properties, options ) {
8893
	var result,
8894
		stopped,
8895
		index = 0,
8896
		length = animationPrefilters.length,
8897
		deferred = jQuery.Deferred().always( function() {
8898
			// don't match elem in the :animated selector
8899
			delete tick.elem;
8900
		}),
8901
		tick = function() {
8902
			if ( stopped ) {
8903
				return false;
8904
			}
8905
			var currentTime = fxNow || createFxNow(),
8906
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
8907
				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
8908
				temp = remaining / animation.duration || 0,
8909
				percent = 1 - temp,
8910
				index = 0,
8911
				length = animation.tweens.length;
8912
8913
			for ( ; index < length ; index++ ) {
8914
				animation.tweens[ index ].run( percent );
8915
			}
8916
8917
			deferred.notifyWith( elem, [ animation, percent, remaining ]);
8918
8919
			if ( percent < 1 && length ) {
8920
				return remaining;
8921
			} else {
8922
				deferred.resolveWith( elem, [ animation ] );
8923
				return false;
8924
			}
8925
		},
8926
		animation = deferred.promise({
8927
			elem: elem,
8928
			props: jQuery.extend( {}, properties ),
8929
			opts: jQuery.extend( true, { specialEasing: {} }, options ),
8930
			originalProperties: properties,
8931
			originalOptions: options,
8932
			startTime: fxNow || createFxNow(),
8933
			duration: options.duration,
8934
			tweens: [],
8935
			createTween: function( prop, end ) {
8936
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
8937
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
8938
				animation.tweens.push( tween );
8939
				return tween;
8940
			},
8941
			stop: function( gotoEnd ) {
8942
				var index = 0,
8943
					// if we are going to the end, we want to run all the tweens
8944
					// otherwise we skip this part
8945
					length = gotoEnd ? animation.tweens.length : 0;
8946
				if ( stopped ) {
8947
					return this;
8948
				}
8949
				stopped = true;
8950
				for ( ; index < length ; index++ ) {
8951
					animation.tweens[ index ].run( 1 );
8952
				}
8953
8954
				// resolve when we played the last frame
8955
				// otherwise, reject
8956
				if ( gotoEnd ) {
8957
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
8958
				} else {
8959
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
8960
				}
8961
				return this;
8962
			}
8963
		}),
8964
		props = animation.props;
8965
8966
	propFilter( props, animation.opts.specialEasing );
8967
8968
	for ( ; index < length ; index++ ) {
8969
		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
8970
		if ( result ) {
8971
			return result;
8972
		}
8973
	}
8974
8975
	jQuery.map( props, createTween, animation );
8976
8977
	if ( jQuery.isFunction( animation.opts.start ) ) {
8978
		animation.opts.start.call( elem, animation );
8979
	}
8980
8981
	jQuery.fx.timer(
8982
		jQuery.extend( tick, {
8983
			elem: elem,
8984
			anim: animation,
8985
			queue: animation.opts.queue
8986
		})
8987
	);
8988
8989
	// attach callbacks from options
8990
	return animation.progress( animation.opts.progress )
8991
		.done( animation.opts.done, animation.opts.complete )
8992
		.fail( animation.opts.fail )
8993
		.always( animation.opts.always );
8994
}
8995
8996
function propFilter( props, specialEasing ) {
8997
	var index, name, easing, value, hooks;
8998
8999
	// camelCase, specialEasing and expand cssHook pass
9000
	for ( index in props ) {
9001
		name = jQuery.camelCase( index );
9002
		easing = specialEasing[ name ];
9003
		value = props[ index ];
9004
		if ( jQuery.isArray( value ) ) {
9005
			easing = value[ 1 ];
9006
			value = props[ index ] = value[ 0 ];
9007
		}
9008
9009
		if ( index !== name ) {
9010
			props[ name ] = value;
9011
			delete props[ index ];
9012
		}
9013
9014
		hooks = jQuery.cssHooks[ name ];
9015
		if ( hooks && "expand" in hooks ) {
9016
			value = hooks.expand( value );
9017
			delete props[ name ];
9018
9019
			// not quite $.extend, this wont overwrite keys already present.
9020
			// also - reusing 'index' from above because we have the correct "name"
9021
			for ( index in value ) {
9022
				if ( !( index in props ) ) {
9023
					props[ index ] = value[ index ];
9024
					specialEasing[ index ] = easing;
9025
				}
9026
			}
9027
		} else {
9028
			specialEasing[ name ] = easing;
9029
		}
9030
	}
9031
}
9032
9033
jQuery.Animation = jQuery.extend( Animation, {
9034
9035
	tweener: function( props, callback ) {
9036
		if ( jQuery.isFunction( props ) ) {
9037
			callback = props;
9038
			props = [ "*" ];
9039
		} else {
9040
			props = props.split(" ");
9041
		}
9042
9043
		var prop,
9044
			index = 0,
9045
			length = props.length;
9046
9047
		for ( ; index < length ; index++ ) {
9048
			prop = props[ index ];
9049
			tweeners[ prop ] = tweeners[ prop ] || [];
9050
			tweeners[ prop ].unshift( callback );
9051
		}
9052
	},
9053
9054
	prefilter: function( callback, prepend ) {
9055
		if ( prepend ) {
9056
			animationPrefilters.unshift( callback );
9057
		} else {
9058
			animationPrefilters.push( callback );
9059
		}
9060
	}
9061
});
9062
9063
function defaultPrefilter( elem, props, opts ) {
9064
	/* jshint validthis: true */
9065
	var prop, value, toggle, tween, hooks, oldfire,
9066
		anim = this,
9067
		orig = {},
9068
		style = elem.style,
9069
		hidden = elem.nodeType && isHidden( elem ),
9070
		dataShow = jQuery._data( elem, "fxshow" );
9071
9072
	// handle queue: false promises
9073
	if ( !opts.queue ) {
9074
		hooks = jQuery._queueHooks( elem, "fx" );
9075
		if ( hooks.unqueued == null ) {
9076
			hooks.unqueued = 0;
9077
			oldfire = hooks.empty.fire;
9078
			hooks.empty.fire = function() {
9079
				if ( !hooks.unqueued ) {
9080
					oldfire();
9081
				}
9082
			};
9083
		}
9084
		hooks.unqueued++;
9085
9086
		anim.always(function() {
9087
			// doing this makes sure that the complete handler will be called
9088
			// before this completes
9089
			anim.always(function() {
9090
				hooks.unqueued--;
9091
				if ( !jQuery.queue( elem, "fx" ).length ) {
9092
					hooks.empty.fire();
9093
				}
9094
			});
9095
		});
9096
	}
9097
9098
	// height/width overflow pass
9099
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
9100
		// Make sure that nothing sneaks out
9101
		// Record all 3 overflow attributes because IE does not
9102
		// change the overflow attribute when overflowX and
9103
		// overflowY are set to the same value
9104
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
9105
9106
		// Set display property to inline-block for height/width
9107
		// animations on inline elements that are having width/height animated
9108
		if ( jQuery.css( elem, "display" ) === "inline" &&
9109
				jQuery.css( elem, "float" ) === "none" ) {
9110
9111
			// inline-level elements accept inline-block;
9112
			// block-level elements need to be inline with layout
9113
			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
9114
				style.display = "inline-block";
9115
9116
			} else {
9117
				style.zoom = 1;
9118
			}
9119
		}
9120
	}
9121
9122
	if ( opts.overflow ) {
9123
		style.overflow = "hidden";
9124
		if ( !jQuery.support.shrinkWrapBlocks ) {
9125
			anim.always(function() {
9126
				style.overflow = opts.overflow[ 0 ];
9127
				style.overflowX = opts.overflow[ 1 ];
9128
				style.overflowY = opts.overflow[ 2 ];
9129
			});
9130
		}
9131
	}
9132
9133
9134
	// show/hide pass
9135
	for ( prop in props ) {
9136
		value = props[ prop ];
9137
		if ( rfxtypes.exec( value ) ) {
9138
			delete props[ prop ];
9139
			toggle = toggle || value === "toggle";
9140
			if ( value === ( hidden ? "hide" : "show" ) ) {
9141
				continue;
9142
			}
9143
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
9144
		}
9145
	}
9146
9147
	if ( !jQuery.isEmptyObject( orig ) ) {
9148
		if ( dataShow ) {
9149
			if ( "hidden" in dataShow ) {
9150
				hidden = dataShow.hidden;
9151
			}
9152
		} else {
9153
			dataShow = jQuery._data( elem, "fxshow", {} );
9154
		}
9155
9156
		// store state if its toggle - enables .stop().toggle() to "reverse"
9157
		if ( toggle ) {
9158
			dataShow.hidden = !hidden;
9159
		}
9160
		if ( hidden ) {
9161
			jQuery( elem ).show();
9162
		} else {
9163
			anim.done(function() {
9164
				jQuery( elem ).hide();
9165
			});
9166
		}
9167
		anim.done(function() {
9168
			var prop;
9169
			jQuery._removeData( elem, "fxshow" );
9170
			for ( prop in orig ) {
9171
				jQuery.style( elem, prop, orig[ prop ] );
9172
			}
9173
		});
9174
		for ( prop in orig ) {
9175
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
9176
9177
			if ( !( prop in dataShow ) ) {
9178
				dataShow[ prop ] = tween.start;
9179
				if ( hidden ) {
9180
					tween.end = tween.start;
9181
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
9182
				}
9183
			}
9184
		}
9185
	}
9186
}
9187
9188
function Tween( elem, options, prop, end, easing ) {
9189
	return new Tween.prototype.init( elem, options, prop, end, easing );
9190
}
9191
jQuery.Tween = Tween;
9192
9193
Tween.prototype = {
9194
	constructor: Tween,
9195
	init: function( elem, options, prop, end, easing, unit ) {
9196
		this.elem = elem;
9197
		this.prop = prop;
9198
		this.easing = easing || "swing";
9199
		this.options = options;
9200
		this.start = this.now = this.cur();
9201
		this.end = end;
9202
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
9203
	},
9204
	cur: function() {
9205
		var hooks = Tween.propHooks[ this.prop ];
9206
9207
		return hooks && hooks.get ?
9208
			hooks.get( this ) :
9209
			Tween.propHooks._default.get( this );
9210
	},
9211
	run: function( percent ) {
9212
		var eased,
9213
			hooks = Tween.propHooks[ this.prop ];
9214
9215
		if ( this.options.duration ) {
9216
			this.pos = eased = jQuery.easing[ this.easing ](
9217
				percent, this.options.duration * percent, 0, 1, this.options.duration
9218
			);
9219
		} else {
9220
			this.pos = eased = percent;
9221
		}
9222
		this.now = ( this.end - this.start ) * eased + this.start;
9223
9224
		if ( this.options.step ) {
9225
			this.options.step.call( this.elem, this.now, this );
9226
		}
9227
9228
		if ( hooks && hooks.set ) {
9229
			hooks.set( this );
9230
		} else {
9231
			Tween.propHooks._default.set( this );
9232
		}
9233
		return this;
9234
	}
9235
};
9236
9237
Tween.prototype.init.prototype = Tween.prototype;
9238
9239
Tween.propHooks = {
9240
	_default: {
9241
		get: function( tween ) {
9242
			var result;
9243
9244
			if ( tween.elem[ tween.prop ] != null &&
9245
				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
9246
				return tween.elem[ tween.prop ];
9247
			}
9248
9249
			// passing an empty string as a 3rd parameter to .css will automatically
9250
			// attempt a parseFloat and fallback to a string if the parse fails
9251
			// so, simple values such as "10px" are parsed to Float.
9252
			// complex values such as "rotate(1rad)" are returned as is.
9253
			result = jQuery.css( tween.elem, tween.prop, "" );
9254
			// Empty strings, null, undefined and "auto" are converted to 0.
9255
			return !result || result === "auto" ? 0 : result;
9256
		},
9257
		set: function( tween ) {
9258
			// use step hook for back compat - use cssHook if its there - use .style if its
9259
			// available and use plain properties where available
9260
			if ( jQuery.fx.step[ tween.prop ] ) {
9261
				jQuery.fx.step[ tween.prop ]( tween );
9262
			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
9263
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9264
			} else {
9265
				tween.elem[ tween.prop ] = tween.now;
9266
			}
9267
		}
9268
	}
9269
};
9270
9271
// Support: IE <=9
9272
// Panic based approach to setting things on disconnected nodes
9273
9274
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
9275
	set: function( tween ) {
9276
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
9277
			tween.elem[ tween.prop ] = tween.now;
9278
		}
9279
	}
9280
};
9281
9282
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
9283
	var cssFn = jQuery.fn[ name ];
9284
	jQuery.fn[ name ] = function( speed, easing, callback ) {
9285
		return speed == null || typeof speed === "boolean" ?
9286
			cssFn.apply( this, arguments ) :
9287
			this.animate( genFx( name, true ), speed, easing, callback );
9288
	};
9289
});
9290
9291
jQuery.fn.extend({
9292
	fadeTo: function( speed, to, easing, callback ) {
9293
9294
		// show any hidden elements after setting opacity to 0
9295
		return this.filter( isHidden ).css( "opacity", 0 ).show()
9296
9297
			// animate to the value specified
9298
			.end().animate({ opacity: to }, speed, easing, callback );
9299
	},
9300
	animate: function( prop, speed, easing, callback ) {
9301
		var empty = jQuery.isEmptyObject( prop ),
9302
			optall = jQuery.speed( speed, easing, callback ),
9303
			doAnimation = function() {
9304
				// Operate on a copy of prop so per-property easing won't be lost
9305
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
9306
9307
				// Empty animations, or finishing resolves immediately
9308
				if ( empty || jQuery._data( this, "finish" ) ) {
9309
					anim.stop( true );
9310
				}
9311
			};
9312
			doAnimation.finish = doAnimation;
9313
9314
		return empty || optall.queue === false ?
9315
			this.each( doAnimation ) :
9316
			this.queue( optall.queue, doAnimation );
9317
	},
9318 View Code Duplication
	stop: function( type, clearQueue, gotoEnd ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
9319
		var stopQueue = function( hooks ) {
9320
			var stop = hooks.stop;
9321
			delete hooks.stop;
9322
			stop( gotoEnd );
9323
		};
9324
9325
		if ( typeof type !== "string" ) {
9326
			gotoEnd = clearQueue;
9327
			clearQueue = type;
9328
			type = undefined;
9329
		}
9330
		if ( clearQueue && type !== false ) {
9331
			this.queue( type || "fx", [] );
9332
		}
9333
9334
		return this.each(function() {
9335
			var dequeue = true,
9336
				index = type != null && type + "queueHooks",
9337
				timers = jQuery.timers,
9338
				data = jQuery._data( this );
9339
9340
			if ( index ) {
9341
				if ( data[ index ] && data[ index ].stop ) {
9342
					stopQueue( data[ index ] );
9343
				}
9344
			} else {
9345
				for ( index in data ) {
9346
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
9347
						stopQueue( data[ index ] );
9348
					}
9349
				}
9350
			}
9351
9352
			for ( index = timers.length; index--; ) {
9353
				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
9354
					timers[ index ].anim.stop( gotoEnd );
9355
					dequeue = false;
9356
					timers.splice( index, 1 );
9357
				}
9358
			}
9359
9360
			// start the next in the queue if the last step wasn't forced
9361
			// timers currently will call their complete callbacks, which will dequeue
9362
			// but only if they were gotoEnd
9363
			if ( dequeue || !gotoEnd ) {
9364
				jQuery.dequeue( this, type );
9365
			}
9366
		});
9367
	},
9368 View Code Duplication
	finish: function( type ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
9369
		if ( type !== false ) {
9370
			type = type || "fx";
9371
		}
9372
		return this.each(function() {
9373
			var index,
9374
				data = jQuery._data( this ),
9375
				queue = data[ type + "queue" ],
9376
				hooks = data[ type + "queueHooks" ],
9377
				timers = jQuery.timers,
9378
				length = queue ? queue.length : 0;
9379
9380
			// enable finishing flag on private data
9381
			data.finish = true;
9382
9383
			// empty the queue first
9384
			jQuery.queue( this, type, [] );
9385
9386
			if ( hooks && hooks.stop ) {
9387
				hooks.stop.call( this, true );
9388
			}
9389
9390
			// look for any active animations, and finish them
9391
			for ( index = timers.length; index--; ) {
9392
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
9393
					timers[ index ].anim.stop( true );
9394
					timers.splice( index, 1 );
9395
				}
9396
			}
9397
9398
			// look for any animations in the old queue and finish them
9399
			for ( index = 0; index < length; index++ ) {
9400
				if ( queue[ index ] && queue[ index ].finish ) {
9401
					queue[ index ].finish.call( this );
9402
				}
9403
			}
9404
9405
			// turn off finishing flag
9406
			delete data.finish;
9407
		});
9408
	}
9409
});
9410
9411
// Generate parameters to create a standard animation
9412
function genFx( type, includeWidth ) {
9413
	var which,
9414
		attrs = { height: type },
9415
		i = 0;
9416
9417
	// if we include width, step value is 1 to do all cssExpand values,
9418
	// if we don't include width, step value is 2 to skip over Left and Right
9419
	includeWidth = includeWidth? 1 : 0;
9420
	for( ; i < 4 ; i += 2 - includeWidth ) {
9421
		which = cssExpand[ i ];
9422
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
9423
	}
9424
9425
	if ( includeWidth ) {
9426
		attrs.opacity = attrs.width = type;
9427
	}
9428
9429
	return attrs;
9430
}
9431
9432
// Generate shortcuts for custom animations
9433
jQuery.each({
9434
	slideDown: genFx("show"),
9435
	slideUp: genFx("hide"),
9436
	slideToggle: genFx("toggle"),
9437
	fadeIn: { opacity: "show" },
9438
	fadeOut: { opacity: "hide" },
9439
	fadeToggle: { opacity: "toggle" }
9440
}, function( name, props ) {
9441
	jQuery.fn[ name ] = function( speed, easing, callback ) {
9442
		return this.animate( props, speed, easing, callback );
9443
	};
9444
});
9445
9446
jQuery.speed = function( speed, easing, fn ) {
9447
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
9448
		complete: fn || !fn && easing ||
9449
			jQuery.isFunction( speed ) && speed,
9450
		duration: speed,
9451
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
9452
	};
9453
9454
	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
9455
		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
9456
9457
	// normalize opt.queue - true/undefined/null -> "fx"
9458
	if ( opt.queue == null || opt.queue === true ) {
9459
		opt.queue = "fx";
9460
	}
9461
9462
	// Queueing
9463
	opt.old = opt.complete;
9464
9465
	opt.complete = function() {
9466
		if ( jQuery.isFunction( opt.old ) ) {
9467
			opt.old.call( this );
9468
		}
9469
9470
		if ( opt.queue ) {
9471
			jQuery.dequeue( this, opt.queue );
9472
		}
9473
	};
9474
9475
	return opt;
9476
};
9477
9478
jQuery.easing = {
9479
	linear: function( p ) {
9480
		return p;
9481
	},
9482
	swing: function( p ) {
9483
		return 0.5 - Math.cos( p*Math.PI ) / 2;
9484
	}
9485
};
9486
9487
jQuery.timers = [];
9488
jQuery.fx = Tween.prototype.init;
9489
jQuery.fx.tick = function() {
9490
	var timer,
9491
		timers = jQuery.timers,
9492
		i = 0;
9493
9494
	fxNow = jQuery.now();
9495
9496
	for ( ; i < timers.length; i++ ) {
9497
		timer = timers[ i ];
9498
		// Checks the timer has not already been removed
9499
		if ( !timer() && timers[ i ] === timer ) {
9500
			timers.splice( i--, 1 );
9501
		}
9502
	}
9503
9504
	if ( !timers.length ) {
9505
		jQuery.fx.stop();
9506
	}
9507
	fxNow = undefined;
9508
};
9509
9510
jQuery.fx.timer = function( timer ) {
9511
	if ( timer() && jQuery.timers.push( timer ) ) {
9512
		jQuery.fx.start();
9513
	}
9514
};
9515
9516
jQuery.fx.interval = 13;
9517
9518
jQuery.fx.start = function() {
9519
	if ( !timerId ) {
9520
		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
9521
	}
9522
};
9523
9524
jQuery.fx.stop = function() {
9525
	clearInterval( timerId );
9526
	timerId = null;
9527
};
9528
9529
jQuery.fx.speeds = {
9530
	slow: 600,
9531
	fast: 200,
9532
	// Default speed
9533
	_default: 400
9534
};
9535
9536
// Back Compat <1.8 extension point
9537
jQuery.fx.step = {};
9538
9539
if ( jQuery.expr && jQuery.expr.filters ) {
9540
	jQuery.expr.filters.animated = function( elem ) {
9541
		return jQuery.grep(jQuery.timers, function( fn ) {
9542
			return elem === fn.elem;
9543
		}).length;
9544
	};
9545
}
9546
jQuery.fn.offset = function( options ) {
9547
	if ( arguments.length ) {
9548
		return options === undefined ?
9549
			this :
9550
			this.each(function( i ) {
9551
				jQuery.offset.setOffset( this, options, i );
9552
			});
9553
	}
9554
9555
	var docElem, win,
9556
		box = { top: 0, left: 0 },
9557
		elem = this[ 0 ],
9558
		doc = elem && elem.ownerDocument;
9559
9560
	if ( !doc ) {
9561
		return;
9562
	}
9563
9564
	docElem = doc.documentElement;
9565
9566
	// Make sure it's not a disconnected DOM node
9567
	if ( !jQuery.contains( docElem, elem ) ) {
9568
		return box;
9569
	}
9570
9571
	// If we don't have gBCR, just use 0,0 rather than error
9572
	// BlackBerry 5, iOS 3 (original iPhone)
9573
	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
9574
		box = elem.getBoundingClientRect();
9575
	}
9576
	win = getWindow( doc );
9577
	return {
9578
		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
9579
		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
9580
	};
9581
};
9582
9583
jQuery.offset = {
9584
9585
	setOffset: function( elem, options, i ) {
9586
		var position = jQuery.css( elem, "position" );
9587
9588
		// set position first, in-case top/left are set even on static elem
9589
		if ( position === "static" ) {
9590
			elem.style.position = "relative";
9591
		}
9592
9593
		var curElem = jQuery( elem ),
9594
			curOffset = curElem.offset(),
9595
			curCSSTop = jQuery.css( elem, "top" ),
9596
			curCSSLeft = jQuery.css( elem, "left" ),
9597
			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9598
			props = {}, curPosition = {}, curTop, curLeft;
0 ignored issues
show
Unused Code introduced by
The assignment to variable curPosition seems to be never used. Consider removing it.
Loading history...
9599
9600
		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9601
		if ( calculatePosition ) {
9602
			curPosition = curElem.position();
9603
			curTop = curPosition.top;
9604
			curLeft = curPosition.left;
9605
		} else {
9606
			curTop = parseFloat( curCSSTop ) || 0;
9607
			curLeft = parseFloat( curCSSLeft ) || 0;
9608
		}
9609
9610
		if ( jQuery.isFunction( options ) ) {
9611
			options = options.call( elem, i, curOffset );
9612
		}
9613
9614
		if ( options.top != null ) {
9615
			props.top = ( options.top - curOffset.top ) + curTop;
9616
		}
9617
		if ( options.left != null ) {
9618
			props.left = ( options.left - curOffset.left ) + curLeft;
9619
		}
9620
9621
		if ( "using" in options ) {
9622
			options.using.call( elem, props );
9623
		} else {
9624
			curElem.css( props );
9625
		}
9626
	}
9627
};
9628
9629
9630
jQuery.fn.extend({
9631
9632
	position: function() {
9633
		if ( !this[ 0 ] ) {
9634
			return;
9635
		}
9636
9637
		var offsetParent, offset,
9638
			parentOffset = { top: 0, left: 0 },
9639
			elem = this[ 0 ];
9640
9641
		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
9642
		if ( jQuery.css( elem, "position" ) === "fixed" ) {
9643
			// we assume that getBoundingClientRect is available when computed position is fixed
9644
			offset = elem.getBoundingClientRect();
9645
		} else {
9646
			// Get *real* offsetParent
9647
			offsetParent = this.offsetParent();
9648
9649
			// Get correct offsets
9650
			offset = this.offset();
9651
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
9652
				parentOffset = offsetParent.offset();
9653
			}
9654
9655
			// Add offsetParent borders
9656
			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
9657
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
9658
		}
9659
9660
		// Subtract parent offsets and element margins
9661
		// note: when an element has margin: auto the offsetLeft and marginLeft
9662
		// are the same in Safari causing offset.left to incorrectly be 0
9663
		return {
9664
			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
9665
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
9666
		};
9667
	},
9668
9669
	offsetParent: function() {
9670
		return this.map(function() {
9671
			var offsetParent = this.offsetParent || docElem;
9672
			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
9673
				offsetParent = offsetParent.offsetParent;
9674
			}
9675
			return offsetParent || docElem;
9676
		});
9677
	}
9678
});
9679
9680
9681
// Create scrollLeft and scrollTop methods
9682
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
9683
	var top = /Y/.test( prop );
9684
9685
	jQuery.fn[ method ] = function( val ) {
9686
		return jQuery.access( this, function( elem, method, val ) {
9687
			var win = getWindow( elem );
9688
9689
			if ( val === undefined ) {
9690
				return win ? (prop in win) ? win[ prop ] :
9691
					win.document.documentElement[ method ] :
9692
					elem[ method ];
9693
			}
9694
9695
			if ( win ) {
9696
				win.scrollTo(
9697
					!top ? val : jQuery( win ).scrollLeft(),
9698
					top ? val : jQuery( win ).scrollTop()
9699
				);
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
9700
9701
			} else {
9702
				elem[ method ] = val;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
9703
			}
9704
		}, method, val, arguments.length, null );
9705
	};
9706
});
9707
9708
function getWindow( elem ) {
9709
	return jQuery.isWindow( elem ) ?
9710
		elem :
9711
		elem.nodeType === 9 ?
9712
			elem.defaultView || elem.parentWindow :
9713
			false;
9714
}
9715
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
9716
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9717
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9718
		// margin is only for outerHeight, outerWidth
9719
		jQuery.fn[ funcName ] = function( margin, value ) {
9720
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9721
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
9722
9723
			return jQuery.access( this, function( elem, type, value ) {
9724
				var doc;
9725
9726
				if ( jQuery.isWindow( elem ) ) {
9727
					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9728
					// isn't a whole lot we can do. See pull request at this URL for discussion:
9729
					// https://github.com/jquery/jquery/pull/764
9730
					return elem.document.documentElement[ "client" + name ];
9731
				}
9732
9733
				// Get document width or height
9734
				if ( elem.nodeType === 9 ) {
9735
					doc = elem.documentElement;
9736
9737
					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
9738
					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
9739
					return Math.max(
9740
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
9741
						elem.body[ "offset" + name ], doc[ "offset" + name ],
9742
						doc[ "client" + name ]
9743
					);
9744
				}
9745
9746
				return value === undefined ?
9747
					// Get width or height on the element, requesting but not forcing parseFloat
9748
					jQuery.css( elem, type, extra ) :
9749
9750
					// Set width or height on the element
9751
					jQuery.style( elem, type, value, extra );
9752
			}, type, chainable ? margin : undefined, chainable, null );
9753
		};
9754
	});
9755
});
9756
// Limit scope pollution from any deprecated API
9757
// (function() {
9758
9759
// The number of elements contained in the matched element set
9760
jQuery.fn.size = function() {
9761
	return this.length;
9762
};
9763
9764
jQuery.fn.andSelf = jQuery.fn.addBack;
9765
9766
// })();
9767
if ( typeof module === "object" && module && typeof module.exports === "object" ) {
9768
	// Expose jQuery as module.exports in loaders that implement the Node
9769
	// module pattern (including browserify). Do not create the global, since
9770
	// the user will be storing it themselves locally, and globals are frowned
9771
	// upon in the Node module world.
9772
	module.exports = jQuery;
9773
} else {
9774
	// Otherwise expose jQuery to the global object as usual
9775
	window.jQuery = window.$ = jQuery;
9776
9777
	// Register as a named AMD module, since jQuery can be concatenated with other
9778
	// files that may use define, but not via a proper concatenation script that
9779
	// understands anonymous AMD modules. A named AMD is safest and most robust
9780
	// way to register. Lowercase jquery is used because AMD module names are
9781
	// derived from file names, and jQuery is normally delivered in a lowercase
9782
	// file name. Do this after creating the global so that if an AMD module wants
9783
	// to call noConflict to hide this version of jQuery, it will work.
9784
	if ( typeof define === "function" && define.amd ) {
0 ignored issues
show
Bug introduced by
The variable define seems to be never declared. If this is a global, consider adding a /** global: define */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
9785
		define( "jquery", [], function () { return jQuery; } );
9786
	}
9787
}
9788
9789
})( window );
9790